/bin/sh 来自标准输入(来自其他程序)的源不是文件

Maj*_*nko 16 sh

命名这个有点棘手......

基本上我有一个程序,它在 STDOUT 上运行时会打印一组 shell 变量:

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Run Code Online (Sandbox Code Playgroud)

我想从 shell 脚本中运行它,就好像 STDOUT 是用source.

我想做一些像......

source `./settings`
Run Code Online (Sandbox Code Playgroud)

......但这当然行不通。

我知道我可以这样做:

./settings >/tmp/file
source /tmp/file
Run Code Online (Sandbox Code Playgroud)

但我真的不想那样做。

有什么线索吗?

use*_*686 20

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

source <(./settings)
Run Code Online (Sandbox Code Playgroud)

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


Kei*_*ith 17

您可以使用eval

eval "$(./settings)"

eval "`./settings`"
Run Code Online (Sandbox Code Playgroud)


Hel*_*o71 6

declare `./settings`
Run Code Online (Sandbox Code Playgroud)

或者当然...

export `./settings`
Run Code Online (Sandbox Code Playgroud)

当然是测试...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty
Run Code Online (Sandbox Code Playgroud)

处理空格:

eval export `./settings`
Run Code Online (Sandbox Code Playgroud)


Law*_*ceC 5

source /dev/stdin < ./settings

我认为 /dev/stdin 是 Linux 独有的东西。

  • `/dev/stdin` 也适用于 BSD 和 Cygwin。 (2认同)
  • 我喜欢这个“/dev/stdin”技巧,但你的答案实际上相当于一个普通的“source ./settings”而不执行它。人们可以使用此处文档来克服这一问题:`source /dev/stdin &lt;&lt;EOF \n $(./settings) \n EOF`。 (2认同)
  • @tlwhitec,或此处字符串(如果可用):`source /dev/stdn &lt;&lt;&lt;"$(./settings)"`。但进程替换(如果可用)甚至更短:`source &lt;(./settings)`。 (2认同)