我正在尝试在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的默认设置还是错误?
这只是一种好奇心,但我很感激您的任何想法和意见。
布赖恩
答案 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
声明,而在于您的echo
。 set
不会展开*
,因为它包含在单引号中,但在没有引号的情况下执行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
扩展的原因是因为它是独立的。当您使用"*"
时,它实际上是在尝试展开以"
开头和结尾的文件 - 您可以在上一个示例中看到这一点。