csh 无法识别命令行选项以 -- 开头的命令

csh doesn't recognize command with command line options beginning with --

我的 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 中完成。关于如何让他工作的任何想法?

这是因为 csh 正在尝试 --exclude=*.csv 扩展为文件名,并抱怨找不到匹配该模式的文件。

您可以通过将选项括在引号中来解决此问题:

rsynv -rv '--exclude=*.csv' ...

或转义星号:

rsynv -rv --exclude=\*.csv ...

这是由于 cshbash 在默认处理带有与文件不匹配的通配符的参数方面不同的结果。 csh 会抱怨,而 bash 只会不管它。

您可能认为 bash选择了更好的方法,但事实并非如此,如以下抄本所示,您有一个与参数匹配的文件:

pax> touch -- '--file=xyzzy.csv' ; ls -- *.csv
--file=xyzzy.csv

pax> echo --file=*.csv
--file=xyzzy.csv

您可以看到 bash shell 扩展了 参数,而不是按原样将其提供给程序。双方各有利弊。