我运行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
或类似的技巧?
答案 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
是可行的方法。