【问题标题】:bash script overrides hard coded variables in executed second scriptbash 脚本覆盖执行的第二个脚本中的硬编码变量
【发布时间】:2018-06-15 19:35:27
【问题描述】:

我打电话给Uncle。我试图在我调用的第二个 bash 脚本中操作具有硬编码值的变量。我无法控制脚本,并且正在围绕它构建一个包装器,以在它最终启动 yocto 构建之前调整一些构建行为。在阅读并尝试了许多示例之后,我不确定还可以尝试什么。

情况举例:

build.sh 调用 build2.sh

IS_DEV=1 ./build2.sh #trying to override value

build2.sh

IS_DEV=0 # hardcoded value
echo $IS_DEV
# always results in 0.

在致电build2.sh 之前,我也尝试过export IS_DEV=1

我确信这很简单,但我似乎无法让它工作。我感谢任何帮助。这可能吗?我在Ubuntu 16.04.4 LTS 上使用GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

哦,我也尝试了采购技术,但没有运气。

IS_DEV=1 . ./build2.sh
IS_DEV=1 source ./build2.sh

我哪里弄错了?

非常感谢。

【问题讨论】:

  • 这个问题和答案表明你可能不走运,除非你能在第二个脚本stackoverflow.com/questions/4609668/…得到支持
  • @BrandonMiller 是的,我看过那篇文章并尝试了示例,不行。我会看看我是否可以获得调整第二个脚本的能力。谢谢。
  • 我总是把你的 build2 写成 : "${IS_DEV:=0}",使 0 明确成为可覆盖的默认值。 (顺便说一句,shell 和 POSIX 实用程序使用全大写变量供自己使用;具有至少一个小写字母的变量的命名空间保留给应用程序使用,并保证不会修改 shell 的行为;请参阅相关规范 @ pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段)
  • @CharlesDuffy 我希望我可以直接编辑被调用的脚本并清理它,但我不能。 :(

标签: bash


【解决方案1】:

如果无法修改脚本,请执行修改后的版本。

sed 's/^IS_DEV=0 /IS_DEV=1 /' build2.sh | sh

显然,如果您需要 Bash 语义而不是 POSIX sh 语义,请通过管道传递到 bash

如果脚本确实硬编码了一个值而无法从命令行覆盖它,那么修改该脚本是唯一可能的解决方法。但是修改可能是短暂的;上面对脚本执行了一个简单的替换,然后将修改后的临时副本通过管道传递到新的 shell 实例以执行。修改只存在于流水线中,不影响build2.sh的磁盘版本。

【讨论】:

  • 谢谢!这救了我。我从来没有用过sed,现在我会的。再次感谢。
  • 嘿伙计们,第二部分是在使用sed 重写第二个脚本的内存副本后,我还需要“转发”一个大命令行到相同的脚本。这样做的方法是什么?例如:sed 's/^IS_DEV=0 /IS_DEV=1 /' build2.sh | bash -d -a 1 --logs 我希望所有“附加”cmd 行参数都传递给 build2.sh,而不是作为 bash shell 的参数。
猜你喜欢
  • 2011-06-04
  • 2021-01-15
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多