在Bash脚本中无法使用别名

4

我有一个可执行文件 command.sh

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

我的终端是bash。

当我像./command.sh这样运行它时,它可以正常工作。

当我像/bin/bash ./command.sh这样运行它时,它找不到一个名为my_command的可执行文件。

当我像/bin/sh ./command.sh这样运行它时,它可以正常工作。

我很困惑。问题出在哪里?


3
您的终端不是bash,而是您的shell是bash。 - Keith Thompson
2个回答

9
从手册中可以看到:

当shell不是交互式的时候,别名不会被展开,除非使用shopt(参见下面SHELL BUILTIN COMMANDS下的 shopt描述)设置expand_aliases shell选项。

换句话说,默认情况下,bash shell脚本不启用别名。使用bash运行脚本将失败。
您的sh似乎默认允许在脚本中使用别名。使用sh运行脚本将成功。 ./command.sh之所以能够工作,是因为您的shebang格式不正确(#!/bin/bash中缺少!)。

3
同一节中后面的部分写道:“几乎每个情况下,shell函数比别名更可取。”我之前从未意识到别名在非交互式 shell 中不会被扩展。这是避免使用别名的又一个理由。相对于csh/tcsh别名而言,Bash别名似乎相当受限。另一方面,csh/tcsh没有函数。 - Keith Thompson
实际上,我来到这个问题是为了简化另一个问题——为什么我的/etc/bash.bashrc或~/profile中的别名没有被使用。所以在这里函数不是一个选项。 - Igor Loskutov
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Igor Loskutov
@IgorLoskutov,有两个shell在工作:您的交互式shell和启动运行脚本的shell。在交互式shell中设置此选项将不起作用,因为那不是您的脚本使用的shell。您必须在脚本中放置shopt -s expand_aliases - that other guy
@IgorLoskutov:将所有别名替换为函数是一个选项吗? - Keith Thompson
@IgorLoskutov。我也遇到了同样的问题 - 在bash脚本中,即使在文件顶部设置了shopt -s expand_aliases,别名扩展也停止工作。它可以工作几行,然后后来就停止工作了。我在不工作的行之前放置了shopt -s expand_aliases,但是bash不会扩展它们。看起来“别名不适用于脚本文件 - 而应该使用函数”是规则。顺便说一下,该部分嵌套两次,在for循环和if中。我尝试将alias=取消缩进到第一列,但没有成功。 - Stephen Hosking

6
别名是用于交互式 shell 的,你需要的是一个函数,例如:
#!/bin/bash
function my_command() {
    echo ok
}

my_command

1
POSIX兼容的函数声明语法只是my_command() {,没有前缀functionfunction关键字存在是为了向后兼容古老的ksh,它使用function my_command {而没有()。结合ksh和POSIX格式得到的结果既不与ksh兼容,也不与POSIX兼容;请参见http://wiki.bash-hackers.org/scripting/obsolete。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接