/bin/sh 源来自 stdin(来自其他程序)而不是文件

/bin/sh 源来自 stdin(来自其他程序)而不是文件

这个名字有点棘手……

基本上我有一个程序,它在运行时在 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}"

相关内容