当在 shell 脚本 header 中指定 #!/bin/bash 时,是否可以为应该使用的 bash 版本添加别名?

Is it possible to add an alias to what bash version should be used when #!/bin/bash is specified in a shell script header?

我运行 MacOS 和 iTerm2。我目前将 iTerm2 设置为使用与 brew 一起安装的 bash 的不同版本(bash 4.4 版,MacOS 本机不附带)。我可以通过 运行ning echo $BASH_VERSION 并将 4.4.23(1)-release 作为输出来验证这一点。

我有一个巨大的bash脚本,我想运行,但是在header中定义了#! /bin/bash。出于某种原因,当我 运行 脚本时,正在使用在该路径中找到的 bash(版本 3.2)的本机版本。

我真的不想改变这个 header 因为我们 运行 生产环境和开发环境中的脚本(最重要的是它在生产服务器上工作 运行 linux)。现在,在本地,我将其更改为 /usr/local/bin/bash 以使其正常工作,但它会在我的 git 流程中产生差异。

是否可以在将 /bin/bash 转换为 /usr/local/bin/bash 或类似技巧的 iTerm 中添加别名或类似技巧?

又快又脏

为什么不直接调用 bash 并将您的脚本作为参数?

/usr/local/bin/bash your_special_production_script.sh

您可以将 shebang 更改为 #! /usr/bin/env bash。这个 shebang 也应该 运行 在其他系统上。

唯一的区别是 env bash 会在您的 PATH 中搜索 bash,而不是完全使用 /bin/bash。在 Mac 上配置您的 PATH 以指向新的 bash 版本。

为了确保您最终得到正确的版本,您可以在脚本的开头添加一个检查;类似

的东西
#! /usr/bin/env bash

versionLt() { [ "$(printf %s\n "$@" | sort -V | head -n1)" = "" ]; }
if versionLt "$BASH_VERSION" 4.4; then
    echo "Required bash 4.4 or higher but found bash $BASH_VERSION"
    exit 2
fi

甚至可以 re-start 使用另一个解释器编写脚本,只要您知道该解释器的路径即可。参数和标准输入将被保留。

exec /path/to/new/version/of/bash "[=11=]" "$@"

您可以遍历可能的路径列表并尝试找到正确的版本,但我认为使用 evn bash 并设置 PATH 是可行的方法。