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

时间:2019-06-07 08:40:57

标签: bash macos iterm2

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

我有一个想要运行的大型bash脚本,但是在标头#! /bin/bash中进行了定义。出于某种原因,当我运行脚本时,正在使用该路径下的bash本地版本(3.2版)。

我真的不想更改此标头,因为我们在生产环境以及开发环境中都运行脚本(最重要的是,它可以在运行linux的生产服务器上运行)。现在,在本地,我将其更改为/ usr / local / bin / bash使其工作,但是它将在git流中生成差异。

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

2 个答案:

答案 0 :(得分:2)

又快又脏

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

/usr/local/bin/bash your_special_production_script.sh

答案 1 :(得分:2)

您可以将shebang更改为pipeline .apply(TextIO.read().from("gs://***/sampleBigtable.csv")) .apply(JdbcIO.<String>write().withDataSourceConfiguration( DataSourceConfiguration.create("org.postgresql.Driver","jdbc:postgresql://***:5432/test") .withUsername("**") .withPassword("password10")) .withStatement("insert into person values(?,?)") .withPreparedStatementSetter((element, query) -> { query.setInt(1, 1); query.setString(2, "Hello"); }) ); 。该shebang也应在其他系统上运行。

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

为确保最终使用正确的版本,可以在脚本的开头添加一个检查标记。

bash

甚至有可能使用另一个解释器重新启动脚本,只要您具有该解释器的路径即可。参数和标准输入将保留。

#! /usr/bin/env bash

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

您可以遍历所有可能的路径并尝试找到正确的版本,但是我认为使用exec /path/to/new/version/of/bash "$0" "$@" 并设置evn bash是可行的方法。

相关问题