代码之家  ›  专栏  ›  技术社区  ›  Brian M. Hunt

Mac OS X-bash默认路径名扩展或bug

  •  1
  • Brian M. Hunt  · 技术社区  · 15 年前

    我正在尝试在Mac OS X 10.6.4的bash中运行以下脚本行(从 this question ):

    $ export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"'
    

    唉,我得到的是意想不到的东西:

    $echo$编辑器
    mvim-f-c“au-vimleave桌面文档下载库电影音乐图片公共网站bin!打开-A终端”

    预期产量为:

    $echo$编辑器
    mvim-f-c“au vimleave*!打开-A终端”

    解决这个问题的方法是 noglob ,即运行 set -f export 转让。然而,目前的问题是,这是否是Mac OS X上的预期行为,因为(因为 小精灵 默认未设置,即 set +f )或者因为里面有个虫子 bash 在Mac OS X上。

    bash的版本是:

    $ bash --version
    GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
    Copyright (C) 2007 Free Software Foundation, Inc.
    

    通过第329页 A practical guide to Unix for Mac OS X users :“除非设置了noglob(第320页),否则当shell遇到不明确的文件引用(包含任何未引号字符的标记)时,它将执行[pathname expansion],?,[,或]”。然而,因为 * 全局化在引号内,问题仍然存在:行为是bash的默认设置还是bug?

    这只是一个好奇心,但我会感激你的任何想法和意见。

    布瑞恩

    1 回复  |  直到 15 年前
        1
  •  7
  •   paxdiablo    15 年前

    你的 EDITOR 变量 设置正确。如果执行以下操作,则可以看到:

    echo "$EDITOR"
    

    看看下面的成绩单:


    pax> export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"'
    
    pax> echo $EDITOR
    mvim -f -c "au VimLeave SecretCiaDoc.txt NsaEchelonKeys.txt !open -a Terminal"
    
    pax> echo "$EDITOR"
    mvim -f -c "au VimLeave * !open -a Terminal"
    

    你的问题不在于 set 但与你的 echo . 这个 设置 不会扩展 * 因为它包含在单引号中,但是执行 回声 不带引号 展开它。

    这不会影响使用环境变量的程序。


    根据您的评论:

    这仍然很奇怪:那 * 仍在引号(双引号)内 回声 命令。 a='abc "*" xyz'; echo $a 不会在bash或dash中为我扩展;事实上,它将引号作为第二个参数。

    注意:

    pax> a='abc "*" xyz' ; echo $a
    abc "*" xyz
    
    pax> a='abc "* xyz' ; echo $a
    abc "* xyz
    
    pax> a='abc " * xyz' ; echo $a
    abc " SecretCiaDoc.txt NsaEchelonKeys.txt xyz
    
    pax> touch '"hello' ; a='abc "* xyz' ; echo $a
    abc "hello xyz
    

    看看发生了什么。这不是治疗 " 像任何特殊的东西一样,只是另一个角色。它为您扩展的原因 编辑 因为它是独立的。当你使用 "*" ,它实际上试图扩展以 -你可以在我上面的最后一个例子中看到。

    推荐文章