Sinceramente il sed è l'ultimo dei problemi in quella funzione.
1) Quando scrivi codice usa il tag code, per favore.
2) Quella funzione lì è in dialetto Bash e non in strictly POSIX, quindi perché dare uno scope globale a $OLDT e $NEWT quando potrebbero benissimo essere dichiarate come variabili locali?
3) Xdialog ritorna il percorso completo della directory stampando in /dev/stderr. Perché reindirizzarlo in un file in /tmp che poi parsi con cat? A che pro? Perché non usi la ridirezione di /dev/stderr in /dev/stdout così da assegnarlo direttamente in una variabile?
Regola UNIX: Mai chiamare processi quando non è realmente necessario, perché perdi in efficienza.
4) Quel sed messo così non ha il minimo senso. Per tre motivi:
4.1) Innanzi tutto dove sta $NEW? Io vedo solo $OLDT e $NEWT. È un typo? O è un'altra variable con scope globale che tu hai messo in una funzione?
4.2) Perché creare il file temp che poi vai a sostituire a startup? Modifica direttamente startup, no? Avrei potuto capire se l'avessi usato a mo' di backup (e nemmeno visto che usi un mv subito dopo anziché un cp), ma in quel caso sed ti offre già dei modi per salvare l'originale.
4.3) I singole quote ' prevengono l'espansione di variabili e sequenze di escape.
Se tu digiti '"$NEW"' stai dicendo che la stringa da sostituire/cercare è "$NEW" (doppi apici inclusi).
con sed "s/$var1/$var2/" file>tem
ho questo messaggio:
sed: -e expression #1, char 20: unknown option to `s'
Quello ti succede perché stai tentando di mandare in sed due path che contengono naturalmente dei /, mandandolo quindi in confusione.
Per risolvere o usi la sequenza escape ai path "\/" (senza doppi apici) oppure usa un delimitatore diverso su sed.
Questa è come avrei scritto io la tua funzione.
Codice: Seleziona tutto
function enable {
local -r newt=$(Xdialog --stdout --dselect $HOME/.FluxPrime 40 100)
local -r oldt=$(grep '$HOME' $HOME/.fluxbox/startup)
sed -i -e "s|$oldt|$newt|" $HOME/.fluxbox/startup # usa -i.orig se vuoi salvare una copia di backup
echo "old.. $oldt --- new.. $newt" #test
}
EDIT: Aggiungo, i singoli apici a $HOME presenti nella chiamata a grep li ho lasciati perché ho ipotizzato che tu stessi cercando proprio $HOME all'interno del file startup.
Chiaramente, se devi cercarne il contenuto vale quanto detto nel punto 4.3
EDIT2: Xdialog supporta la ridirezione automatica con --stdout, quindi puoi pure usare il parametro diretto. Ho modificato la funzione.