代码之家  ›  专栏  ›  技术社区  ›  Dronacharya

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

  •  1
  • Dronacharya  · 技术社区  · 9 年前

    我的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 回复  |  直到 9 年前
        1
  •  2
  •   paxdiablo    9 年前

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

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

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

    或转义星号:

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

    这是这样的结果 csh公司 bash 不同之处在于它们默认处理与文件不匹配的通配符参数。 csh公司 会抱怨 猛击 只会把它放在一边。

    你可以 认为 猛击 选择了更好的方式,但不一定是这样,如下面的成绩单所示,其中您有一个与参数匹配的文件:

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

    你可以看到 猛击 扩展 争论,而不是把它交给程序。双方都有自己的优点和缺点。