我有一个可执行文件 command.sh
#/bin/bash
alias my_command='echo ok'
my_command
我的终端是bash。
当我像./command.sh
这样运行它时,它可以正常工作。
当我像/bin/bash ./command.sh
这样运行它时,它找不到一个名为my_command的可执行文件。
当我像/bin/sh ./command.sh
这样运行它时,它可以正常工作。
我很困惑。问题出在哪里?
我有一个可执行文件 command.sh
#/bin/bash
alias my_command='echo ok'
my_command
我的终端是bash。
当我像./command.sh
这样运行它时,它可以正常工作。
当我像/bin/bash ./command.sh
这样运行它时,它找不到一个名为my_command的可执行文件。
当我像/bin/sh ./command.sh
这样运行它时,它可以正常工作。
我很困惑。问题出在哪里?
换句话说,默认情况下,bash shell脚本不启用别名。使用当shell不是交互式的时候,别名不会被展开,除非使用shopt(参见下面SHELL BUILTIN COMMANDS下的
shopt
描述)设置expand_aliases
shell选项。
bash
运行脚本将失败。sh
似乎默认允许在脚本中使用别名。使用sh
运行脚本将成功。
./command.sh
之所以能够工作,是因为您的shebang格式不正确(#!/bin/bash
中缺少!
)。shopt -s expand_aliases
。 - that other guyshopt -s expand_aliases
,别名扩展也停止工作。它可以工作几行,然后后来就停止工作了。我在不工作的行之前放置了shopt -s expand_aliases
,但是bash不会扩展它们。看起来“别名不适用于脚本文件 - 而应该使用函数”是规则。顺便说一下,该部分嵌套两次,在for
循环和if
中。我尝试将alias=
取消缩进到第一列,但没有成功。 - Stephen Hosking#!/bin/bash
function my_command() {
echo ok
}
my_command
my_command() {
,没有前缀function
;function
关键字存在是为了向后兼容古老的ksh,它使用function my_command {
而没有()
。结合ksh和POSIX格式得到的结果既不与ksh兼容,也不与POSIX兼容;请参见http://wiki.bash-hackers.org/scripting/obsolete。 - Charles Duffy