为了账号安全,请及时绑定邮箱和手机立即绑定

停止shell通配符字符扩展?

停止shell通配符字符扩展?

红颜莎娜 2019-07-09 15:13:12
停止shell通配符字符扩展?编译后的命令行程序是否可以告诉bash或csh它不希望参数中的通配符被扩展?例如,您可能需要一个shell命令,如:foo *返回该字符的数字ASCII值。
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

虽然命令本身不能关闭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了。

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


查看完整回答
反对 回复 2019-07-09
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

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

   set -o noglob

将关闭调用shell中的扩展,但您必须这样做。以前你调用你的程序。

另一种选择是引用你的论点。

foo "*"


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 712 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信