【问题标题】:Replace Environment Variables in File [duplicate]替换文件中的环境变量[重复]
【发布时间】:2021-08-01 10:32:48
【问题描述】:

我有一个 myfile,其中包含类似的行

#!/usr/bin/env python3
print("Hello world")
names = ('${(j:', ':)ZSH_VAR[@]}', )

我想在我加载的 shell 中使用环境变量预处理这个文件(在我的例子中是zsh,但通用的bash 解决方案也可以很好地工作)。

我该怎么做相当于

$ declare -ga ZSH_VAR=( 1 2 3 )
$ preprocess < myfile

这样的输出是

#!/usr/bin/env python3
print("Hello world")
bar=('1', '2', '3', )

【问题讨论】:

  • 我不确定我是否理解正确,但是您在寻找envsubst吗?
  • eval 'bar="$BAR"'declare 'bar="$BAR"'?
  • 查看 Wooledge wiki 上的 TemplateFiles 页面。

标签: bash shell environment-variables zsh


【解决方案1】:

您可以为此目的使用eval

$ BAR=1234 FOO=abcd; while read -r line; do eval 'echo "'"$line"'"'; done < "file"

或者在脚本中。 (script.sh)

#!/bin/bash

while read -r line; do eval 'echo "'"$line"'"'"; done < "file"

# If you want to redirect the output into a file (out.txt).
# while read -r line; do eval 'echo "'"$line"'" >> out.txt'; done < "file"
# Or  this
# while read -r line; do eval 'echo "'"$line"'"'; done < "file" > out.txt

然后像这样调用脚本:

FOO=abcd BAR=1234 ./script.sh 

注意

小心。确保您的文件不包含rm 命令。只是为了安全。

【讨论】:

  • 只有在您信任数据的情况下才能使用。改用envsubst 更安全;文件中的$(rm -rf ~) 不可能破坏您的主目录。
  • 如果你打算使用eval,最好使用eval 'echo "'"$line"'"',这样你就没有包含* HELLO *的行替换*s使用文件名列表,或将制表符更改为空格,或删除前导制表符,等等。也就是说,正如目前所写的那样,这个答案有很多意外/不受欢迎的行为。
  • ideone.com/mBq9IS查看上述问题的演示
  • ...将上面的输出与ideone.com/FjpPC0展示的较少损坏(但仍然不安全)的方法进行比较
  • (还要注意显示固定版本的链接中 read 之前的 IFS= ——这会阻止 read 在进入 line 变量之前删除前导和尾随空格!)
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多