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

时间:2015-09-03 09:06:07

标签: bash csh

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

1 个答案:

答案 0 :(得分:2)

这是因为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 扩展参数,而不是按原样将它提供给程序。双方各有利弊。

相关问题