我的csh脚本中有一个rsync命令,如下所示:
#! /bin/csh -f
set source_dir = "blahDir/blahBlahDir"
set dest_dir = "foo/anotherFoo"
rsync -av --exclude=*.csv ${source_dir} ${dest_dir}
当我运行时,我收到以下错误:
rsync: No match.
如果删除--exclude
选项,则可以使用。我在bash中编写了等效的脚本,并按预期工作
#/bin/bash -f
source_dir="blahDir/blahBlahDir"
dest_dir="foo/anotherFoo"
rsync -av --exclude=*.csv ${source_dir} ${dest_dir}
问题是这必须仅在csh中完成。关于如何让他上班的任何想法?
答案 0 :(得分:2)
这是因为csh
正在尝试将 --exclude=*.csv
扩展为文件名,并因为无法找到与该模式匹配的文件而抱怨。
您可以通过将选项括在引号中来解决这个问题:
rsynv -rv '--exclude=*.csv' ...
或逃避星号:
rsynv -rv --exclude=\*.csv ...
这是csh
和bash
使用不匹配文件的通配符默认处理参数的方式的结果。 csh
会抱怨,而bash
只是不管它。
您可能认为 bash
选择了更好的方法,但并不一定如此,如下面的抄本所示,您的文件与参数匹配:
pax> touch -- '--file=xyzzy.csv' ; ls -- *.csv
--file=xyzzy.csv
pax> echo --file=*.csv
--file=xyzzy.csv
你可以看到bash
shell 扩展参数,而不是按原样将它提供给程序。双方各有利弊。