【问题标题】:Mac OS X - bash default pathname expansion or bugMac OS X - bash 默认路径名扩展或错误
【发布时间】:2011-05-02 10:37:12
【问题描述】:

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

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

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

$ 回声 $EDITOR
mvim -f -c "au VimLeave 桌面文档下载库电影音乐图片公共站点 bin !open -a 终端"

预期的输出是:

$ 回声 $EDITOR
mvim -f -c "au VimLeave * !open -a 终端"

解决此问题的方法是设置noglob,即在export 分配之前立即运行set -f。然而,手头的问题是这是否是 Mac OS X 上的预期行为,因为(因为默认情况下未设置 noglob,即 set +f)还是因为在 Mac OS X 上 bash 中存在错误。

bash 的版本是:

$ bash --版本 GNU bash,版本 3.2.48(1)-release (x86_64-apple-darwin10.0) 版权所有 (C) 2007 Free Software Foundation, Inc.

A practical guide to Unix for Mac OS X users 的第 329 页可能会提供一些帮助:“除非设置了 noglob(第 320 页),否则 shell 在遇到不明确的文件引用时会执行 [路径名扩展]——一个包含任何不带引号的字符 &、?、[ 或 ]。”。然而,因为被通配的* 是在引号内,所以问题仍然存在:该行为是 bash 的默认设置还是错误?

这只是一种好奇,但如果您有任何想法和意见,我将不胜感激。

布赖恩

【问题讨论】:

    标签: macos bash glob


    【解决方案1】:

    您的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 语句,而在于您的echoset 不会扩展 *,因为它包含在单引号中,但在不带引号的情况下执行 echo 扩展它。

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


    根据您的评论:

    这仍然很奇怪:* 仍然在 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
    

    看看发生了什么。它没有将" 视为任何特殊的东西,只是另一个字符。它为您的EDITOR 扩展的原因是因为它是独立的。当您使用"*" 时,它实际上是在尝试扩展以" 开头和结尾的文件——您可以在我上面的最后一个示例中看到这一点。

    【讨论】:

    • 这仍然很奇怪:对于 echo 命令, * 仍在引号内(双引号)。 a='abc "*" xyz'; echo $a 不会在 bash 或 dash 中为我扩展;事实上,它包含引号作为第二个参数。
    • 请注意,我没有在 OS X 上进行测试,但我正在运行 bash 4.1.5;似乎可能有一个不同的 shell 选项可以解释这种行为,但我找不到它。
    • @Roger,查看更新,希望能解释清楚。
    • 啊,这就解释了! (并且 shopt -s failglob 在这里非常有用。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2015-02-03
    • 2011-03-21
    • 2012-01-19
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多