将 stdout 和 stderr 都重定向到文件时,为什么必须将 stderr 重定向到 stdout 放在最后?

将 stdout 和 stderr 都重定向到文件时,为什么必须将 stderr 重定向到 stdout 放在最后?

要将 stdout 和 stderr 重定向到文件:

curl 'https://example.com' > myfile 2>&1

这工作正常,但为什么标准错误到标准输出的重定向必须在最后呢?

为什么不能是:

curl 'https://example.com' 2>&1 > myfile

我不明白为什么这个替代方案不起作用;它不会将 stderr 重定向到该文件。从左到右阅读:“下载网页,将 stderr 重定向到 stdout,并将 stdout 重定向到文件”,但这显然不是 Bash 解释命令的方式。 Bash 预计2>&1会排在最后。为什么一定要2>&1放在最后呢?

答案1

相信我,我有这个疑问很长时间了。现在,我用简单的话记住了它。

这里的fd意思是file descriptor.

在第二种情况下fd2将指向曾经fd1在哪里。然后fd2会指向其他地方。

为了便于理解,请考虑一下

fd1 --> stdout
2>&1, means fd2 --> stdout
then >some_file means fd1 --> some_file

所以,fd2不是跟随fd1,而是跟随的目标fd1

相关内容