2014-09-28 62 views
2

我有一堆功能和一些别名。我从来没有想通了这两个问题:奇怪的b​​ash别名扩展

export EDITOR="emacsclient -t" 
alias vi='$EDITOR' 
alias pa='ps ax | egrep -i ' 

当我进入

pa vi 

我得到

egrep: invalid option -- 't' 

显然,在“六”的扩大,当内另一别名,尽管它不在行首。为什么会这样,我能做些什么呢?

要仔细检查,这一点:

ps ax | egrep vi 

正确执行。 的bash --version GNU的bash,版本4.3.11(1)-release下(x86_64-PC-Linux的GNU)

回答

7

您在鲜为人知的外壳编程陷阱之一已经迷迷糊糊。

通常情况下,vi在该上下文中不会被别名扩展,因为alias扩展仅适用于命令中的第一个单词(而不是环境变量赋值)。但是,如bash manual所示:

如果别名值的最后一个字符是空白,则会检查别名后面的下一个命令字是否用于别名扩展。

词不能跨越的别名及其周边文本,所以没有必要的空间,在结束:

alias pa='ps ax | egrep -i ' 

如果将其更改为:

alias pa='ps ax | egrep -i' 

东西将按预期工作。但你应该真的使用shell functions而不是别名;功能更强大,更古怪,而且速度更快。

注:对于那些寻找更多的证据表明是bash越野车,我赶紧补充说,用空格结束别名的奇特行为来自POSIX规范,因此将会对任何符合的外壳相同的:

如果替换单词的别名的值以<blank>结尾,那么shell将检查下一个命令字是否有别名替换;这个过程应该继续下去,直到发现一个不是有效别名的字或者一个别名值不以<blank>结尾。 (XSH,§ 2.3.1)