我正在交互式shell中执行bash命令,如下所示:
./somescript.sh
输出为
OS platform is: linux2
killall agent
agent: no process killed
第三行来自stderr。
但是当我在子shell中执行为
var=$('./somescript.sh' 2>&1)
agent: no process killed
OS platform is: linux2
killall agent
为什么该代理程序:现在没有在第一行中进行打印而杀死任何进程? 如何使两者一致?
编辑:
但是当我这样做的时候
var=$('./somescript.sh' 1>&2)
我可以看到它在bash调试模式下以正确的顺序给出了输出。但是它没有存储在变量var中。
答案 0 :(得分:7)
为什么代理人:现在没有在第一行进行打印而杀死任何进程?
我想那是因为stdout被缓冲了,而stderr没有(或没有那么多)。因此,在流agent: no process killed
行之后,stderr get会被刷新,而在脚本stdout
存在之后,./somescript.sh
将被刷新。因此,第一个显示在屏幕上的是第一个冲洗的流-即。 stderr。在控制台中运行时,stderr和stdout都设置为行加buff,int命令替换我想bash set的stdout会被完全缓冲。
如何使两者一致?
您可以尝试在命令替换中设置行缓冲。 var=$(stdbuf -oL -eL ./somescript.sh 2>&1)