Başarısız, basitleştirilmiş örnek:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Komutu şuymuş gibi alıntıları eklemem gerekiyor:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Başarısız, basitleştirilmiş örnek:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Komutu şuymuş gibi alıntıları eklemem gerekiyor:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Yanıtlar:
Kısa cevap: bakınız BashFAQ # 50 ("Bir değişkene bir komut koymaya çalışıyorum, ancak karmaşık durumlar her zaman başarısız oluyor!").
Uzun cevap: Komutları (veya komutların bölümlerini) değişkenlere koymak ve sonra onları tam olarak geri almak karmaşıktır. Kabuk, komut satırında bir değişkeni genişlettiğinde, değişken çift tırnak içinde ise ayrıştırılmaz; tırnak işaretleri içinde değilse, boşluklar argüman kesmeleri olarak ayrıştırılır, ancak alıntılar ve kaçışlar ayrıştırılmaz. Her iki durumda da değişkenin değerine tırnak koymak hiçbir işe yaramaz.
Genellikle, bu tür bir şeyi yapmanın en iyi yolu basit bir metin değişkeni yerine bir dizi kullanmaktır:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval başka bir seçenektir:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Ayrıca bakınız:
Sorunu görmüyorum:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Belki tekrar değer teklif etmelisin:
$ rsync "$FLAGS" dir1 dir2
echone düşündüğünü göstermiyor. printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"Bu seçeneklerin hiçbirinin neden işe yaramadığını görmeye çalışın .