【问题标题】:Order mismatch between stdout and stderr in bashbash中stdout和stderr之间的顺序不匹配
【发布时间】:2019-07-03 23:46:18
【问题描述】:

我在交互式 shell 中执行 bash 命令 ./somescript.sh

输出为

OS platform is: linux2
killall agent
agent: no process killed

第三行来自标准错误。

但是当我在子shell中执行时

var=$('./somescript.sh' 2>&1)
agent: no process killed
OS platform is: linux2
killall agent

为什么代理:没有进程被杀死现在在第一行打印? 我怎样才能使它们保持一致?

编辑: 但是,当我这样做时, var=$('./somescript.sh' 1>&2) 我可以看到它在 bash 调试模式下以正确的顺序给出输出。但它没有存储在变量 var 中。

【问题讨论】:

  • 您需要更改 ./somescript.sh 以从正在写入 stderr 的命令重定向。
  • @StephenC 我猜,你是说要像 1>&2 那样做,对吧?在那种情况下,我如何打印标准错误?变量将只包含标准输出对吗?不是标准错误..
  • 如果没有看到脚本并了解它的作用,我无法回答这些问题,
  • “但是,当我这样做时,var=$('./somescript.sh' 1>&2) 由 StephenC 建议” - 这不是我的建议!我实际上说的是您需要更改 脚本

标签: bash shell stdout stderr io-redirection


【解决方案1】:

为什么代理:没有进程被杀死现在在第一行打印?

我猜是因为 stdout 是缓冲的,而 stderr 不是(或没有那么多)。因此,在流式传输agent: no process killed 行之后,stderr get 被刷新,而在脚本./somescript.sh 存在之后,stdout 被刷新。所以第一个出现在屏幕上的是第一个刷新的流——即。标准错误。在控制台中运行时,stderr 和 stdout 都设置为 line buffed,int 命令替换我猜 bash set 的 stdout 是完全缓冲的。

我怎样才能使它们保持一致?

您可以尝试在命令替换中设置行缓冲。 var=$(stdbuf -oL -eL ./somescript.sh 2>&1)

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2013-09-02
    • 2017-06-22
    相关资源
    最近更新 更多