
可変rsyncパラメータについて質問があります。 COMPILE_FILTERS変数にフィルタ式を連結しています。例:
COMPILE_FILTERS='--filter="- js/editor/editorjs/*"'
rsync -a $COMPILE_FILTERS \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*" \
$src $dest
次の応答が表示されます。
Unknown filter rule: `"-'
rsync error: syntax or usage error (code 1) at exclude.c(927)
[client=3.1.3]
通訳がハイフンをブロックしているようなので、これは奇妙です。
提案があれば、事前に感謝の気持ちを伝えてください。
答え1
コードには2つの問題があります。
拡張は
$COMPILE_FILTERS
引用されていません。これは、その値が--filter="- js/editor/editorjs/*"
空白の単語に分割されることを意味します(デフォルトでは)。この言葉--filter="-
はとですjs/editor/editorjs/*"
。この単語はファイル名の生成(ワイルドカード)を実行しますが、あなたの場合、そのパターンに一致するファイルがある場合にのみ問題になりますjs/editor/editorjs/*"
。2つの単語に分けると、
rsync
次のようになります。2つの引数、そのうちの最初の項目は正しく使用されません(エラーメッセージで参照されているもの)。あなたが解決これ二重引用符で引用された変数を拡張すると、問題が解決します。
変数に保存した文字列含む二重引用符。変数拡張を二重引用符で囲む場合は、デフォルトで
rsync
フィルタ"- js/editor/editorjs/*"
(二重引用符とすべての項目を含む)を使用することを意味します。これは、文字列の周りに一重引用符を使用しているためです。あなたが解決これ変数に正しい文字列を割り当てて問題を解決します。
COMPILE_FILTERS=--filter="- js/editor/editorjs/*"
または
COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
最終結果:
COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
rsync -a "$COMPILE_FILTERS" \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*" \
"$src" "$dest"
コードに関連する他の変数も参照しています。
また見なさい:
後で変数により多くのフィルタを含めることにした場合は、配列に切り替える必要があります(これらのフィルタをサポートするシェルで)。
filters=(
--filter="- js/editor/editorjs/*"
--filter="- *node_modules*"
--filter="- .git*"
--filter="- /**/.git*"
)
rsync --archive "${filters[@]}" "$src" "$dest"
名前付き配列変数(/bin/sh
、、dash
)を持たないシェルではlessと入力できます。
set -- \
--filter="- js/editor/editorjs/*" \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*"
rsync --archive "$@" "$src" "$dest"
個々のフィルタパラメータを適切に処理するには、配列またはリストが必要です。複数のフィルタを単一の文字列に結合することは可能ですが、シェルのトークン化とファイル名のグロービングを適切に処理する必要があるため、はるかに困難です。