我知道 bash
有“捕获输出”的功能,类似于以下两个单独的文件:
sub.sh: echo hello
main.sh: greeting="$(./sub.sh)"
这将把变量greeting
设置为hello
。
然而,我需要编写一个脚本,在其中只捕获一些信息,允许其余的内容转到“正常”的标准输出:
sub.sh: xyzzy hello ; plugh goodbye
main.sh: greeting="$(./sub.sh)"
我希望的是把代码中的
hello
放置到变量 greeting
中,但将goodbye
发送到main.sh
的标准输出。为了实现这种行为,魔术命令xyzzy
和plugh
需要替换成什么(或者在main.sh
中可以做些什么)?我猜可以通过一些巧妙的句柄重定向来实现,但我不确定。如果不可能,那我将不得不写一个临时文件,以后再使用,但我更愿意避免这样做。
为了让事情更清晰,这里是我正在使用的测试用例(目前使用的是不起作用的文件句柄3方法)。首先是
sub.sh
:echo xx_greeting >&3 # This should be captured to variable.
echo xx_stdout # This should show up on stdout.
echo xx_stderr >&2 # This should show up on stderr.
接着是main.sh
:
greeting="$(./sub.sh)" 3>&1
echo "Greeting was ${greeting}"
我是这样运行它的:
./main.sh >/tmp/out 2>/tmp.err
期望看到以下文件:
/tmp/out:
xx_stdout
Greeting was xx_greeting
/tmp/err:
xx_stderr
sub.sh: echo hello; echo nasty >&3
,main.sh: exec 3>&1; var=$(./sub.sh)
。 - user10678532