【问题标题】:Alias doesn't work inside a Bash script [duplicate]别名在 Bash 脚本中不起作用 [重复]
【发布时间】:2021-10-30 12:11:20
【问题描述】:

我有一个可执行文件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 是 bash。

标签: bash sh alias


【解决方案1】:

来自bash 手册页:

当 shell 不是交互式时,别名不会展开,除非使用 shopt 设置了 expand_aliases shell 选项(请参阅 shoptSHELL BUILTIN COMMANDS 下的描述)。

换句话说,默认情况下,bash shell 脚本中不启用别名。当您使用bash 运行脚本时,它会失败。

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

./command.sh 恰好可以工作,因为您的 shebang 格式不正确(您在 #!/bin/bash 中缺少 !)。

【讨论】:

  • 稍后在同一节中:“对于几乎所有目的,shell 函数都比别名更受欢迎。”我从来没有意识到别名不会在非交互式外壳中扩展。这是避免它们的另一个原因。与 csh/tcsh 别名相比,Bash 别名似乎相当残缺。另一方面,csh/tcsh 没有功能。
  • 实际上,我来到这个问题试图简化另一个问题 - 为什么我的 /etc/bash.bashrc 或 ~/profile 的别名没有被使用。所以功能在这里不是一个选项。
  • 另外我在执行之前正在做shopt -s expand_aliases,或者甚至像shopt -s expand_aliases; ...一样在同一行,但它仍然没有得到它。
  • @IgorLoskutov 有两个 shell 在工作:交互式 shell,以及开始运行脚本的 shell。在您的交互式 shell 中设置此选项将不起作用,因为这不是您的脚本使用的 shell。您必须将shopt -s expand_aliases 放入您的脚本中。
  • @IgorLoskutov:用函数替换所有别名是一种选择吗?
【解决方案2】:

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

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

my_command

【讨论】:

  • 符合POSIX的函数声明语法只是my_command() {,前面没有functionfunction 关键字的存在是为了向后兼容古代 ksh,它使用 function my_command { 而没有 ()。结合 ksh 和 POSIX 格式可以得到一个不兼容的结果;见wiki.bash-hackers.org/scripting/obsolete
猜你喜欢
  • 2022-10-24
  • 2023-01-25
  • 2021-05-27
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2011-03-02
相关资源
最近更新 更多