停止shell通配符扩展?

时间:2012-07-12 16:30:47

标签: bash wildcard

有没有办法让编译的命令行程序告诉bash或csh它不希望扩展其参数中的任何通配符?

例如,人们可能想要一个shell命令,如:

foo *

简单地返回该字符的数字ASCII值。

5 个答案:

答案 0 :(得分:92)

没有。扩展发生在命令实际运行之前 您只能在运行命令之前禁用glob,或者引用星号。

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *

$ # alternative to set -f
$ set -o noglob
$ # undo it by 
$ set +o noglob

答案 1 :(得分:47)

虽然命令本身无法关闭通配符,但用户可以告诉Unix shell不要对特定命令进行通配。这通常通过编辑shell的配置文件来完成。假设可以在命令路径中找到命令foo,则需要将以下内容添加到相应的配置文件中:

对于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'

不必使用命令路径。假设命令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'

以上所有内容均使用Apple的OSX 10.9.2进行测试。 注意:复制上述代码时,请注意删除任何空格。它们可能很重要。

更新

用户geira指出了bash shell的情况

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

可以替换为

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

消除了对函数foo的需要。

用于创建此文档的一些网站:

答案 2 :(得分:7)

在程序运行之前,shell会执行扩展。您的程序不知道是否发生了扩展。

   set -o noglob

将关闭调用shell中的扩展,但在调用程序之前,您必须执行

另一种方法是引用你的论点,例如

foo "*"

答案 3 :(得分:1)

注意:如果没有与掩码匹配的名称,bash按原样传递参数,不进行扩展!

证明(pa.py是一个非常简单的脚本,只打印其参数):

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']

答案 4 :(得分:0)

没有。在执行命令之前,Bourne样式的shell总是在适当时执行globbing。用户必须引用或转义参数以防止全局变形,如foo \*;正在执行的实际程序无法表明偏好。