回答:
簡単な答え:BashFAQ#50(「コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します!」)を参照してください。
長い答え:コマンド(またはコマンドの一部)を変数に入れてからそのまま戻すことは複雑です。シェルがコマンドラインで変数を展開するときに、変数が二重引用符で囲まれている場合、解析されません。引用符で囲まれていない場合、その中のスペースは引数ブレークとして解析されますが、引用符とエスケープは解析されません。どちらの場合でも、変数の値に引用符を付けても何の役にも立ちません。
通常、この種のことを行う最良の方法は、単純なテキスト変数の代わりに配列を使用することです。
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
evalは別のオプションです。
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
こちらもご覧ください:
問題は見当たりません。
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
値を再度引用する必要があるかもしれません:
$ rsync "$FLAGS" dir1 dir2
echo
あなたがそれが何であると思うかを示していません。試してみてくださいprintargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
、なぜどちらも、これらのオプションの作業を見ていないし。