停止shell通配符扩展?
编译的命令行程序是否有任何方法告诉bash或csh它不想在其参数中扩展任何通配符?
例如,可能需要一个shell命令,如:
foo *
简单地返回该字符的数字ASCII值。
不。扩展发生在命令实际运行之前。
您只能在运行该命令或通过引用星号之前禁用该glob。
$ # quote it $ foo '*' $ # or escape it $ foo \* $ # or disable the glob (noglob) $ set -f $ foo *
虽然命令本身不能closures通配符,但是用户可以告诉Unix shell不要遍历一个特定的命令。 这通常通过编辑一个shell的configuration文件来完成。 假设命令path中可以find命令foo
,则需要将以下内容添加到相应的configuration文件中:
对于sh,bash和ksh shell:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
对于csh和tcsh shell:
alias foo 'set noglob;\foo \!*;unset noglob'
对于zsh shell:
alias foo='noglob foo'
命令path不必使用。 假设命令foo被存储在目录〜/ bin中,那么上面就会变成:
对于sh,bash和ksh shell:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
对于csh和tcsh shell:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
对于zsh shell:
alias foo='noglob ~/bin/foo'
以上所有都是使用苹果的OSX 10.9.2进行testing的。 注意:复制上述代码时,请注意删除空格。 他们可能是重要的。
更新:
用户geira指出,在一个bash shell的情况下
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
可以被replace
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
这消除了对foo函数的需要。
一些网站用于创build此文档:
-
Unix shell
-
将命令行parameter passing给Bash别名命令
-
Csh – C Shell
-
Bash内build命令
-
与Bourne shell和csh启动序列进行比较
-
别名循环在csh中
-
如何将命令行parameter passing给shell别名?
-
当bash函数具有相同的名称时调用程序
-
特殊的shellvariables
-
C Shell别名与命令行参数
-
防止shell脚本中的通配符扩展/局部变形
在程序运行之前,扩展是由shell执行的。 你的程序不知道扩展是否已经发生。
setopt noglob
将closures调用shell中的扩展,但是在调用程序之前,您必须这样做。
另一种方法是引用你的论点
foo "*"
注意:如果没有与掩码匹配的名字,bash按原样传递参数,而不扩展!
certificate(pa.py是一个非常简单的脚本,只是打印它的参数):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
不可以 。在执行命令之前,Bourne风格的shell总是在适当的时候执行globbing 。 用户必须引用或逃避参数,以防止globbing,如foo \*
; 正在执行的实际程序不能指示偏好。