rsync—排除而不排除第一个值

rsync—排除而不排除第一个值,rsync,Rsync,当我使用rsync-exclude时,如下所示: rsync -avzhe --exclude={'/var/','/generated/','/app/etc/env.php'} --dry-run /home/site/ /home/site2/ …未排除目录/var/ 但是,如果我这样做: rsync -avzhe --exclude={'/ignore/','/var/','/generated/','/app/etc/env.php'} --dry-run /home/site/ /

当我使用rsync-exclude时,如下所示:

rsync -avzhe --exclude={'/var/','/generated/','/app/etc/env.php'} --dry-run /home/site/ /home/site2/
…未排除目录/var/

但是,如果我这样做:

rsync -avzhe --exclude={'/ignore/','/var/','/generated/','/app/etc/env.php'} --dry-run /home/site/ /home/site2/
除了/ignore/目录是假的之外,所有操作都按预期进行。在使用exclude={}语法时,似乎忽略了第一个值

我做错了什么?

您的代码是:

rsync -avzhe --exclude={'/var/','/generated/','/app/etc/env.php'} [...]
{}是bash语法。扩展后,命令行变为:

rsync -avzhe --exclude=/var/ --exclude=/generated/ [...]
展开rsync选项将提供:

rsync -a -v -z -h -e --exclude=/var/ --exclude=/generated/ [...]
rsync选项-e定义为:

-e, --rsh=COMMAND           specify the remote shell to use
由此我们可以看到,-e之后的第一个参数被用作命令,而不是作为排除规则处理。您正在执行本地复制,因此此选项/参数对未使用。如果您一直在执行远程复制,您可能会看到类似以下错误:rsync:Failed to exec-exclude=/var/


解决方法是为-e指定一个命令或不使用它。

我在这里没有看到任何会导致此问题的内容。尝试将set-x放在它前面,看看bash认为括号表达式会扩展成什么。请注意,set-x的输出有时使用意外的引用/转义样式;在这种情况下,我希望它只保留单引号,因为它们实际上并不需要,但如果它在输出中使用引号。。。这可能表明里面有些奇怪的东西。