2015-05-08 48 views
3

里面工作,我有一个可执行文件command.sh别名没有一个bash脚本

#/bin/bash 
alias my_command='echo ok' 
my_command 

我的终端是bash的。

当我运行它像./command.sh,它工作正常。

当我像/bin/bash ./command.sh那样运行它时,它找不到my_command可执行文件。

当我运行它像/bin/sh ./command.sh,它工作正常。

我很困惑。问题在哪里?

+2

“我的终端是bash。”不,你的* shell *是bash。 –

回答

7

bash手册页:

别名没有扩展的时候shell不是交互,除非expand_aliases外壳选择是使用shopt设置(参见下shell内建的shopt的 描述下面的命令)。

换句话说,缺省情况下,bash shell脚本中未启用别名。当您使用bash运行脚本时,它将失败。

您的sh似乎默认允许在脚本中使用别名。当您使用sh运行脚本时,它会成功。

./command.sh恰好工作,因为您的朋友格式不正确(您错过在#!/bin/bash)。

+3

稍后在同一节中:“对于几乎所有目的而言,shell函数都优于别名。”我从来没有意识到别名在非交互式shell中没有扩展。这是避免它们的另一个理由。相对于csh/tcsh别名,Bash别名似乎相当残废。另一方面,csh/tcsh没有函数。 –

+0

实际上,我试图简化另一个问题 - 为什么我的/etc/bash.bashrc中的别名或〜/ profile没有被使用。所以功能在这里不是一个选项。 –

+0

另外,我在执行之前正在执行'shopt -s expand_aliases',甚至在'shopt -s expand_aliases; ......但它仍然没有得到它。 –

2

别名用于交互式shell,您需要的是一个函数,例如

#!/bin/bash 
function my_command() { 
    echo ok 
} 

my_command