注:以下の質問が含まれていrsync
ますが、いいえに関する質問ですrsync
。 zsh 配列に関する質問です。
EXCLUDES
このように変数を初期化すると
EXCLUDES=( --exclude=/foo --exclude=/bar --exclude=/baz )
その後、コマンドを実行すると
rsync -a $EXCLUDES / /some/target
/foo
...では、/bar
およびが/baz
実際にコピーされていないことを確認しました/some/target
。
EXCLUDE_ITEMS
しかし、今こう言いましょう。
EXCLUDE_ITEMS=( /foo /bar /baz )
...このようにEXCLUDEを初期化します。
EXCLUDES=()
for item in $EXCLUDE_ITEMS
do
EXCLUDES+=( "--exclude='$item'" )
done
...またはこれ
EXCLUDES=( $(for item in $EXCLUDE_ITEMS; do echo "--exclude='$item'"; done) )
...それで、両方の場合を実行した後
rsync -a $EXCLUDES / /some/target
...これで除外されたディレクトリは次のとおりです。いいえ譲渡対象から除外されます。
EXCLUDES
(ターミナルに入力される)コマンドラインはすべて同じであるため、明示的に初期化したコマンドラインと繰り返しを通じて初期化したコマンドラインには違いがあると結論付けることができますが、EXCLUDE_ITEMS
それが何かはわかりません。
実行時に後者が実際に除外されるようにEXCLUDE
プロジェクトを初期化する方法EXCLUDE_ITEMS
rsync -a $EXCLUDES / /some/target
PS:実際には、私が実行したら
eval "rsync -a $EXCLUDES / /some/target"
...上記のループベースの方法の1つで初期化されている場合、ここで指定されたディレクトリはEXCLUDES
実際には必要に応じて除外されます。for
EXCLUDES
答え1
問題は、を作成すると、"--exclude='$item'"
除外パターンに一重引用符を追加することです。したがって、背後を除いて、'/foo'
名前が一重引用符で始まり、終わるファイルはありません。
あなたは書く必要があります
EXCLUDES+=( "--exclude=$item" )
またはzshなので、二重引用符は必要ありません。ただ書いてください。
EXCLUDES+=( --exclude=$item )
またはzshなので、ループは必要ありません。^
パラメータ拡張オプション:
rsync -a --exclude=$^EXCLUDE_ITEMS …
kshまたはbashではループと二重引用符が必要です。
EXCLUDES=()
for item in "${EXCLUDE_ITEMS[@]}"; do
EXCLUDES+=( "--exclude=$item" )
done
rsync -a "${EXCLUDES[@]}" …