首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回送至stderr,并将stderr输出到文件。

回送至stderr,并将stderr输出到文件。
EN

Stack Overflow用户
提问于 2019-11-10 03:55:31
回答 2查看 1.5K关注 0票数 1

我试图将输出回显到stderr,同时将stderr重定向到一个文件,我注意到重定向的顺序很重要,但我不明白为什么要这样做。

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

代码语言:javascript
复制
echo "Fatal error." >&2 2>asap
echo >&2 "Fatal error." 2>asap

但这是可行的,将“致命错误”记录到文件asap

代码语言:javascript
复制
echo "Fatal error." 2>asap >&2

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-10 04:05:15

有关大多数所需信息,请参见如何管好stderr而不是标准。请特别注意“反差”的注释。请记住,所有重定向都是在执行命令之前完成的,并且重定向是从左到右处理的。(管道稍微使故事复杂化了。大多数情况下,标准输出的管道重定向是在任何其他重定向之前完成的。异常是特定于Bash的语法|&。阅读Bash 手册获得详细信息,然后不要使用|&)。)

注意,相对于命令名和参数,可以将重定向定位在命令行的任何位置。这就是:

代码语言:javascript
复制
<html> xml some -command

是相同的

代码语言:javascript
复制
some -command <html >xml

诸若此类。因此,问题中的前两个命令没有区别。(我认为这是你自己发现的。)

问题中的第一个命令:

代码语言:javascript
复制
echo "Fatal error." >&2 2>asap

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

最后一条命令:

代码语言:javascript
复制
echo "Fatal error." 2>asap >&2

首先向文件发送标准错误,然后将标准输出发送到标准错误要发送到(文件)的相同位置,然后执行echo命令。由于标准输出要到文件中,所以终端上看不到任何内容。

票数 2
EN

Stack Overflow用户

发布于 2019-11-10 04:05:27

重定向从左到右发生,因此它们可以根据位置的不同采取不同的行动。

例如,这两个命令:

代码语言:javascript
复制
runme >somefile 2>&1
runme 2>&1 >somefile

因为顺序不同而产生不同的效果。

首先将标准输出指向文件somefile,然后将标准错误指向新的标准输出(文件)。

第二个指向当前标准输出的标准错误(很可能是终端),然后将标准输出指向文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58785592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档