停止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 \* ; 正在执行的实际程序不能指示偏好。

Interesting Posts