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

时间:2010-10-29 14:06:15

标签: macos bash glob

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

$ export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"'
唉,我得到的是意想不到的东西:

$ echo $ EDITOR
mvim -f -c“au VimLeave桌面文档下载库电影音乐图片公共站点bin!open -a Terminal”

预期输出为:

$ echo $ EDITOR
mvim -f -c“au VimLeave *!open -a Terminal”

解决此问题的方法是设置noglob,即在set -f分配之前立即运行export。但是,问题在于这是否是Mac OS X上的预期行为,因为(因为noglob默认情况下未设置,即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.

通过A practical guide to Unix for Mac OS X users的第329页可能会有一些帮助:“除非设置了noglob(第320页),否则shell在遇到不明确的文件引用时会执行[路径名扩展] - 包含任何内容的令牌未加引号的字符&,?,[,或]。“但是因为被{globalbed的*在引号内,问题仍然存在:行为是bash的默认设置还是错误?

这只是一种好奇心,但我很感激您的任何想法和意见。

布赖恩

1 个答案:

答案 0 :(得分:7)

您的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命令的引号(双引号)内。 {b}或破折号中a='abc "*" xyz'; echo $a不会为我扩展;实际上,它包含引号作为第二个参数。

注意:

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扩展的原因是因为它是独立的。当您使用"*"时,它实际上是在尝试展开以"开头和结尾的文件 - 您可以在上一个示例中看到这一点。