停止shell通配符字符扩展?

停止shell通配符字符扩展?

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

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

foo *

返回该字符的数字ASCII值。


红颜莎娜
浏览 713回答 3
3回答

慕容708150

虽然命令本身不能关闭globing,但是用户可以告诉Unixshell不要覆盖特定的命令。这通常是通过编辑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外壳: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外壳:alias foo='noglob ~/bin/foo'以上所有这些都是用苹果的OSX10.9.2进行测试的。注意:在复制上述代码时,请注意删除任何空格。它们可能很重要。最新情况:用户盖拉指出在bash壳的情况下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了。用于创建本文档的一些网站:Unix壳将命令行参数传递给BashAlias命令CSH-C壳Bash Builtin命令Bourneshell和CSH启动序列的比较CSH中的别名循环如何将命令行参数传递给shell别名?当bash函数具有相同的名称时调用程序特殊壳变量带有命令行参数的shell别名防止Shell脚本中的通配符扩展/全局化

梦里花落0921

展开是在程序运行之前由shell执行的。您的程序不知道是否发生了扩展。   set -o noglob将关闭调用shell中的扩展,但您必须这样做。以前你调用你的程序。另一种选择是引用你的论点。foo "*"
打开App,查看更多内容
随时随地看视频慕课网APP