【问题标题】:Capturing output to variable only works with redirection将输出捕获到变量仅适用于重定向
【发布时间】:2022-01-01 09:35:16
【问题描述】:

我知道将标准输出捕获到变量的构造是var=$(...)。但是为什么以下不起作用?

docker pull nginx
version=$(docker run --rm --entrypoint nginx nginx:latest -version)
echo $version

然而,我发现在上面的第二行添加2>&1 可以使事情正常进行,即:

version=$(docker run --rm --entrypoint nginx nginx:latest -version 2>&1)

谁能帮我解释一下为什么在这种情况下我们需要添加额外的重定向?

【问题讨论】:

  • 这是因为信息正在输出到stderr(文件号2)。所以重定向2>&1stderr 重定向到stdout(文件号1)这是由命令替换(例如$(...))捕获的内容
  • 这是有道理的。我想我很惊讶为什么该命令的输出输出到stderr。我不知道如何将评论标记为答案,但我赞成您的评论。谢谢
  • 很多实用程序输出信息(版本等)到stderr,所以如果你正在捕获输出,你只会得到实际的程序输出,而不是混入的信息。

标签: bash stdout io-redirection stderr command-substitution


【解决方案1】:

这不是因为 docker。它需要搜索 NGINX 端。 看起来 NGINX 版本打印参数是不成功的 sysout。这就是为什么您需要将 ERROR 也重定向到 OUTPUT。

注意:如果您在主机中执行以下命令,则会出现同样的问题。

~# nginx -v
nginx version: nginx/1.14.2
~# aa=$(nginx  -v)
nginx version: nginx/1.14.2
~# echo $aa
~#

对于 Apache,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2018-10-15
    • 2022-11-30
    • 1970-01-01
    • 2014-10-31
    • 2019-04-10
    • 2011-10-13
    相关资源
    最近更新 更多