我对变量 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
您的代码有两个问题。
的扩展
$COMPILE_FILTERS
未加引号。这意味着它的值--filter="- js/editor/editorjs/*"
将会被分割成空格上的单词(默认情况下)。这些词是--filter="-
和js/editor/editorjs/*"
。然后,这些单词将进行文件名生成(通配符),但就您而言,只有当您碰巧在某个地方有一个与该模式匹配的文件时,这才会成为问题js/editor/editorjs/*"
。分成两个词意味着
rsync
将得到两个论点,并且它无法正确使用其中的第一个(这就是您的错误消息所指的内容)。你解决这通过双引号引用变量的扩展来解决问题。
您保存在变量中的字符串包括双引号。如果您对变量的扩展进行双引号,则基本上是在告诉您
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"
请注意,我还引用了代码中涉及的其他变量。
也可以看看:
如果您稍后决定在变量中包含更多过滤器,请确保切换到数组(在支持这些过滤器的 shell 中):
filters=(
--filter="- js/editor/editorjs/*"
--filter="- *node_modules*"
--filter="- .git*"
--filter="- /**/.git*"
)
rsync --archive "${filters[@]}" "$src" "$dest"
在没有命名数组变量(/bin/sh
, dash
)的 shell 中,您可以输入 less:
set -- \
--filter="- js/editor/editorjs/*" \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*"
rsync --archive "$@" "$src" "$dest"
您需要一个数组或列表来正确处理单独的过滤器参数。尝试将多个过滤器组合成一个字符串是可行的,但要困难得多,因为您必须正确处理 shell 的分词和文件名通配。