这个名字有点棘手……
基本上我有一个程序,它在运行时在 STDOUT 上打印一组 shell 变量:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
我想在 shell 脚本中运行这个程序,就好像使用 STDOUT 进行评估一样source
。
我想做类似的事情......
source `./settings`
...但这当然不起作用。
我知道我可以做到:
./settings >/tmp/file
source /tmp/file
但我真的不想这么做。
有什么线索吗?
答案1
您可以使用eval
:
eval "$(./settings)"
eval "`./settings`"
答案2
在可用的系统上/dev/fd
,bash 支持进程替换:
source <(./settings)
这里,<( )
将扩展到一个自动分配的路径,可以从中读取/dev/fd/...
的输出。./settings
答案3
declare `./settings`
或者当然...
export `./settings`
当然要测试一下...
export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty
处理空格:
eval export `./settings`
答案4
想在这里提供另一种观点,因为其他答案会创建文件而不是直接从 stdin 中提取。我有一些构建需要将一些准备好的环境信息发送到多个脚本。我正在做的是在字符串中准备一堆与 Bash 兼容的变量赋值:
Var1="Foo"
Var2="Bar"
Var3="Baz"
当我准备执行脚本时,我对上述多行字符串进行 base64 编码并将其导入到我的 shell 脚本中:
echo base64EncodedParameters | build.sh
在 build.sh 中,我从 stdin 读取,进行 base64 解码并评估结果。
params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`
echo "Hello ${Var1} ${Var2}"