[当我同时将STDERR
和STDOUT
都重定向到同一文件时,尽管它与1>testfile.xml 2>&1
相同,但似乎不起作用?
示例:
perl -e 'print "1\n" ; warn "2\n";' 1>testfile.xml 2>testfile.xml
cat testfile.xml
# outputs '1' only.
现在,为什么会这样混乱?我真的很困惑……STDERR
被重定向到testfile.xml,所以STDOUT
也被重定向到。为什么这种行为?我想念什么吗?
两个重定向不相同。在执行操作时,标准输出和标准错误都将重定向到同一文件,但具有它们自己的文件独立句柄,包括要写入的位置。在脚本结束时,标准错误被无缓冲写入,并且标准输出被缓冲和刷新,从而覆盖了写入标准错误的开头部分。如果您的warn
打印更长的时间,则可以看到以下内容:
$ perl -e 'print "1" ; warn "foo\n";' 1>testfile.xml 2>testfile.xml
$ cat testfile.xml
1oo
使用2>&1
,标准输出和标准错误都引用相同的打开文件句柄/描述符,并且它们不会相互覆盖。