2010-03-23 78 views
10

我无法在bash中获得expand_aliases生效。我尝试了很多不同的东西,没有任何工作。无法让expand_aliases生效

下面是简单的测试用例:

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;' 

和输出:

$ /bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;' 
alias cdtmp='cd /tmp' 
/bin/bash: cdtmp: command not found 
/home/user 

$ /bin/bash --version 
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 

(是的,我使用禁用了javascript,而不是-o选项抨击,只是为了证明它的存在)

任何想法?

+0

您是否尝试过'shopt -p expand_aliases'来查看它是否实际启用? – Chris 2010-03-23 16:29:02

+0

是的,它回来了。丹尼斯得到了它;当我将上述内容保存到一个shell脚本并运行它时,它正常运行。 – sachmet 2010-03-23 18:14:44

回答

11

别名不在同一行或定义它们的相同函数中。

从Bash的手册页:

 
     The rules concerning the definition and use of aliases are somewhat 
     confusing. Bash always reads at least one complete line of input 
     before executing any of the commands on that line. Aliases are 
     expanded when a command is read, not when it is executed. Therefore, 
     an alias definition appearing on the same line as another command does 
     not take effect until the next line of input is read. The commands 
     following the alias definition on that line are not affected by the new 
     alias. This behavior is also an issue when functions are executed. 
     Aliases are expanded when a function definition is read, not when the 
     function is executed, because a function definition is itself a com‐ 
     pound command. As a consequence, aliases defined in a function are not 
     available until after that function is executed. To be safe, always 
     put alias definitions on a separate line, and do not use alias in com‐ 
     pound commands. 

     For almost every purpose, aliases are superseded by shell functions. 

Bash Reference Manual

对于几乎每一个目标之后,壳牌功能优先了别名。

而不是上面的最后一句[强调我的]。我认为别名是命令行的便利,而不是脚本中应该使用的内容(包括那些仅由bash -c单线程组成的脚本)。

+1

这是一些严重的LMManPageTFY – 2012-05-10 21:45:38

+0

他们应该将这也添加到bash info:“并且因此,函数中使用的别名必须定义在别名的函数定义实际工作之前。” – 2014-06-08 03:57:50