首页 > 解决方案 > 回显到 stderr 并将 stderr 输出到文件

问题描述

我正在尝试将输出回显到 stderr 并将 stderr 同时重定向到文件,我注意到重定向的顺序很重要,但我不明白为什么必须这样。

asap使用以下任一命令,该文件为空:

echo "Fatal error." >&2 2>asap
echo >&2 "Fatal error." 2>asap

但这有效,将“致命错误”记录到文件asap中。

echo "Fatal error." 2>asap >&2

为什么?

标签: bashredirectstderr

解决方案


有关大多数必需信息,请参阅如何通过管道传输 stderr 而不是 stdout。请特别注意“相反”的评论。请记住,所有重定向都在命令执行之前完成,并且重定向是从左到右处理的。(管道稍微复杂化了这个故事。大多数时候,标准输出的管道重定向在任何其他重定向之前完成。例外是 Bash 特定的语法,|&请阅读 Bash手册了解详细信息 - 然后不要使用|&.)

请注意,重定向可以位于命令行上相对于命令名称和参数的任何位置。那是:

<html> xml some -command

是相同的

some -command <html >xml

等等。因此,问题中的前两个命令之间没有区别。(我认为你自己发现了这一点。)

问题中的第一个命令:

echo "Fatal error." >&2 2>asap

首先将标准输出重定向到当前的标准错误,然后将标准错误重定向到文件(让标准输出指向原来的标准错误),然后执行echo命令。该消息转到原始标准错误(您的终端),而不是文件,因为echo不写入标准错误。

最后一条命令:

echo "Fatal error." 2>asap >&2

首先将标准错误发送到文件,然后将标准输出发送到标准错误要去的地方(文件),然后执行echo命令。由于标准输出将发送到文件,因此终端上看不到任何内容。


推荐阅读