当在 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
是可行的方法。
我运行 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
是可行的方法。