Esempio semplificato e semplificato:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Ho bisogno di includere le virgolette come se il comando fosse così:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Esempio semplificato e semplificato:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Ho bisogno di includere le virgolette come se il comando fosse così:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Risposte:
Risposta breve: vedi BashFAQ # 50 ("Sto cercando di inserire un comando in una variabile, ma i casi complessi falliscono sempre!").
Risposta lunga: inserire comandi (o parti di comandi) in variabili e poi ripristinarli intatti è complicato. Quando la shell espande una variabile sulla riga di comando, se la variabile era tra virgolette non viene analizzata; se non era tra virgolette, gli spazi in esso vengono analizzati come interruzioni di argomento, ma le virgolette e l'escape non vengono analizzate. In entrambi i casi, inserire le virgolette nel valore della variabile non fa nulla di utile.
Di solito, il modo migliore per fare questo genere di cose è usare un array invece di una semplice variabile di testo:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval è un'altra opzione:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Guarda anche:
Non vedo il problema:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Forse devi citare di nuovo il valore:
$ rsync "$FLAGS" dir1 dir2
echonon sta mostrando quello che pensi che sia. Prova printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"a capire perché nessuna di queste opzioni funziona.