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


14

有点棘手的名字...

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

但是我真的不想这么做。

有什么线索吗?

Answers:


16

您可以使用eval

eval "$(./settings)"

eval "`./settings`"

抱歉,应该提到,它是/ bin / sh而不是bash。$()不起作用。我已经更新了问题。
马延科2011年

@Matt:嗯,在大多数系统上sh都是重击。当然,除非您是指Ubuntu的最新版本,否则已将其替换为破折号。
Hello71 2011年

@Matt:在这种情况下,反引号应该起作用。但是您也应该添加确切的版本sh-它可能是短划线,灰烬,busybox的符号链接...我还没有看到“真实的'sh'”副本。
2011年

1
@Matt:所以那里有一个有趣的系统。特别是由于几乎所有的“ sh”变体都支持$( )-从4.3BSD中的 Almquist的外壳开始-也是POSIX。(注意:不争论,只是好奇。)
user1686

$()存在,在这种情况下它不能像这样工作。FreeBSD 8.2的/ bin / sh
Majenko

15

/dev/fd可用的系统上,bash支持进程替换:

source <(./settings)

在这里,<( )将扩展到一个自动分配的路径,/dev/fd/...从该路径./settings可以读取输出。


1
在bash手册中,这称为“进程替换”。
glenn jackman 2011年

6
declare `./settings`

还是当然...

export `./settings`

当然测试一下...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

处理空格:

eval export `./settings`

export啊,这招有用!谢谢
Majenko

现在-如何处理值中的空格?
2011年

@Matt:我不能在评论中使用反引号,因此请参见编辑后的答案。
user1686 2011年

@grawity:是的,您可以...a backtick --> ` <-- and here's another one --> ` <--
Hello71 2011年

2

source /dev/stdin < ./settings

我认为/ dev / stdin不过是Linux专用的东西。


尝试获取设置内容的来源。即使使用“ ./settings”,也无法使用“ ./settings”:歧义('=反引号)
Majenko 2011年

/dev/stdin也可以在BSD和Cygwin上使用。
user1686 2011年

1
|但是,使用(至少不是完全正确的)是行不通的,因为管道的两侧都是单独的子进程,因此源命令不会影响当前的shell。
user1686 2011年

1
编辑以反映这一点。
LawrenceC

1
我喜欢这个/dev/stdin技巧,但是您的答案实际上等同于source ./settings不执行该命令的平原。可以使用此处文档来克服此问题:source /dev/stdin <<EOF \n $(./settings) \n EOF
tlwhitec

0

想要在这里提供另一种观点,因为其他答案会创建文件,而不是直接从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}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.