Bash 停止shell通配符扩展?

Bash 停止shell通配符扩展?,bash,wildcard,Bash,Wildcard,编译后的命令行程序是否可以告诉bash或csh它不希望在其参数中扩展任何通配符 例如,可能需要一个shell命令,如: foo * 只返回该字符的数字ASCII值。在程序运行之前,shell将执行扩展。您的程序不知道是否发生了扩展 set -o noglob 将关闭调用shell中的扩展,但必须在调用程序之前关闭 另一种方法是引用你的论点 foo "*" 否。扩展在命令实际运行之前进行。 您只能在运行命令或引用星号之前禁用glob $ # quote it $ foo '*' $

编译后的命令行程序是否可以告诉bash或csh它不希望在其参数中扩展任何通配符

例如,可能需要一个shell命令,如:

foo *

只返回该字符的数字ASCII值。

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

   set -o noglob
将关闭调用shell中的扩展,但必须在调用程序之前关闭

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

foo "*"

否。扩展在命令实际运行之前进行。
您只能在运行命令或引用星号之前禁用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

虽然命令本身不能关闭globbing,但用户可以告诉unixshell不要对特定命令进行glob。这通常通过编辑shell的配置文件来实现。假设可以沿着命令路径找到命令
foo
,则需要将以下内容添加到相应的配置文件中:

对于sh、bash和ksh壳:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
alias foo 'set noglob;\foo \!*;unset noglob'
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
对于csh和tcsh壳体:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
alias foo 'set noglob;\foo \!*;unset noglob'
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
对于zsh外壳:

alias foo='noglob foo'
alias foo='noglob ~/bin/foo'
不必使用命令路径。假设命令foo存储在~/bin目录中,则上述内容将变为:

对于sh、bash和ksh壳:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
alias foo 'set noglob;\foo \!*;unset noglob'
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
对于csh和tcsh壳体:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
alias foo 'set noglob;\foo \!*;unset noglob'
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
对于zsh外壳:

alias foo='noglob foo'
alias foo='noglob ~/bin/foo'
所有这些都是使用苹果的OSX 10.9.2进行测试的。 注意:复制上述代码时,请小心删除任何空格。它们可能意义重大

更新: 用户指出,在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函数

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


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

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


而且,如果没有什么可扩展的,就没有扩展。i、 e.对于空的
pwd
echo*
只是
*
@sam,这实际上取决于您的选项设置方式。“如果找不到匹配的文件名,并且shell选项
nullglob
被禁用,则该单词保持不变。如果设置了
nullglob
选项,但未找到匹配项,则该单词将被删除。”谢谢,我应该根据观察而不是任何理解来限定它。@c00kiemon5ter如何撤销
集合-f
?这是不是
unset-f
?@NamGVU
set+f
这应该是公认的答案,因为它证明了OP想要做什么确实是可能的。对于bash中的一些更好的方法,这个链接记录了各种选项:@geira:有时在发布更好的答案之前,会接受答案。我相信这可能是其中之一。我还相信,用户认为最有用的答案最终会排在第一位。注意:我将您的输入添加到我的答案中。@geira,OP希望编译后的程序与shell通信;回答说可以逐个命令地将shell配置为所需的行为是一个有用的答案,我自己也会接受这个答案,但我确实认为在是否完全正确的问题上存在分歧。可以做到这一点并不意味着应该做到这一点。从用户对select命令的合理期望改变shell的行为听起来令人惊讶,而且最终是不受欢迎的。@tripleee:曾经有一段时间人们期望继电器和真空管。预计将在纸板卡和纸带上打孔。人们拿着计算尺,而不是计算器和电话。我想这对你来说是可取的。我不太在乎那些时候。我真的很喜欢看下一步,但不总是这样
set-o nullglob
shopt-s failglob
,此行为将发生变化(以两种截然不同的方式)。setopt似乎是zsh特定的命令。正如另一张海报所说,对于bash,您可以使用
set-o noglob
来禁用通配符扩展。非常感谢。