在bash中,如何捕获变量中的一些输出,让其余部分变为标准输出

如何解决在bash中,如何捕获变量中的一些输出,让其余部分变为标准输出

我了解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的标准输出中。

魔术命令xyzzyplugh需要替换为上面的什么(或在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?