【发布时间】: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>&1将stderr重定向到stdout(文件号1)这是由命令替换(例如$(...))捕获的内容 -
这是有道理的。我想我很惊讶为什么该命令的输出输出到
stderr。我不知道如何将评论标记为答案,但我赞成您的评论。谢谢 -
很多实用程序输出信息(版本等)到
stderr,所以如果你正在捕获输出,你只会得到实际的程序输出,而不是混入的信息。
标签: bash stdout io-redirection stderr command-substitution