bash中stdout和stderr之间的顺序不匹配

时间:2019-02-10 07:35:43

标签: bash shell stdout stderr io-redirection

我正在交互式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中。

1 个答案:

答案 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)