首页 文章

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

提问于
浏览
1

我在我的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 回答

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

相关问题