如何解决在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
解决方法
@ user414777在评论中建议(如果他们想复制此答案,我会接受并删除此答案,以便他们获得满分),可以通过引入 extra 来完成。 em>文件描述符如下。
首先使用sub.sh
脚本,该脚本仅将不同的内容写入三个不同的描述符(第一个隐式>&1
):
echo for-var
echo for-out >&3
echo for-err >&2
第二,main.sh
称呼它:
exec 3>&1
greeting="$(./sub.sh)"
echo "Variable is ${greeting}"
然后您只需运行它,以确保知道什么输出将输出到不同的位置:
pax> ./main.sh > xxout 2> xxerr
pax> cat xxout
for-out
Variable is for-var
pax> cat xxerr
for-err
因此,您可以看到,从sub.sh
调用main.sh
时,写入文件句柄1的内容进入捕获变量,写入文件句柄2的内容进入标准错误,而写入到文件句柄的内容文件句柄3进入标准输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。