编辑
请不仅查看已接受的答案,还请查看其他答案。
问题
为什么将 STDOUT 和 STDERR 都重定向到同一个文件不起作用,尽管它看起来与 1>[FILENAME] 2>&1 相同?
这是一个例子:
perl -e 'print "1\n" ; warn "2\n";' 1>a.txt 2>a.txt
cat a.txt
# outputs '1' only.
嗯,为什么?我认为这是可行的,因为... STDOUT 被重定向到 a.txt,STDERR 也是如此。STDERR 发生了什么?
使用
1>a.txt 2>&1
,文件描述符#1 被复制到#2。它们都引用同一个“打开文件”,并且它们都共享当前位置和 r/w 模式。(实际上使用 2>&1 和 2<&1 之间根本没有区别。)使用
1>a.txt 2>a.txt
,两个文件描述符都独立打开并具有单独的光标位置。(该文件也被截断两次。)如果您将“Hello”写入 fd #1,它的位置将前进到字节 5,但 fd #2 仍保留在字节 0。打印到 fd #2 只会覆盖从 0 开始的数据.这很容易看出第二次写入是否更短:
请注意,Perl 具有内部缓冲,因此在此示例中,需要显式 flush() 以确保 fd #1 数据在 fd #2 数据之前写入。否则,流将在退出时以不可预知的顺序刷新。
为了比较,如果文件描述符是共享的,则写入只是彼此跟随:
您的两个重定向都会截断文件,因此第二个(按执行时间顺序)将覆盖第一个。尝试
或者只是使用相同的文件描述符