【问题标题】:Output not captured in bash variable [duplicate]输出未在 bash 变量中捕获 [重复]
【发布时间】:2016-09-04 02:22:28
【问题描述】:

我注意到,当尝试将命令的输出捕获到 bash 变量时,一些行根本没有被捕获,尽管在变量分配未完成时它们会打印在终端上。一个例子是ssh-keyscan,当横幅消息被启用时。另一个例子是来自 Python SimpleHTTPServer 的访问日志。

这些如何打印在终端上但没有捕获到变量中?

【问题讨论】:

  • 因为它们不是发送到stdout,而是发送到stderr。参见例如ls laajalkdjlajfkecho "hello"。前者写信给stderr,而后者写给stdout
  • 这是有道理的。虽然,在 Python HTTP 服务器的情况下,即使我将 2>&1 重定向到 /dev/null 请求日志也会显示在终端中。
  • 我明白了。您应该详细说明您在何处以及如何使用它,以便我们充分理解您的问题。
  • 标准输出和标准错误不是唯一可能的文件描述符。但是,您更有可能写了类似2>&1 > /dev/null 而不是> /dev/null 2>&1 之类的东西,这将两者都指向/dev/null
  • OUTPUT=$({ ERROR=$(cmd.sh 2>&1 1>&$TMP_FD); } {TMP_FD}>&1) 这将在不同的变量中捕获标准错误和标准输出,并让你看到状态

标签: bash


【解决方案1】:

可能 fedorqui 在他的评论中有一个原因......

在这种情况下,您可以使用重定向选项 2>&1 将标准错误重定向到标准输出。 像这样:

toto=$( ls tioto 2>&1 )
echo $toto
ls: cannot access tioto: No such file or directory

【讨论】: