我看到1> testfile.xml 2>&1与1> testfile.xml 2> testfile.xml有很大不同-但是为什么?

问题描述 投票:0回答:1

[当我同时将STDERRSTDOUT都重定向到同一文件时,尽管它与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也被重定向到。为什么这种行为?我想念什么吗?

shell
1个回答
4
投票

两个重定向不相同。在执行操作时,标准输出和标准错误都将重定向到同一文件,但具有它们自己的文件独立句柄,包括要写入的位置。在脚本结束时,标准错误被无缓冲写入,并且标准输出被缓冲和刷新,从而覆盖了写入标准错误的开头部分。如果您的warn打印更长的时间,则可以看到以下内容:

$ perl -e 'print "1" ; warn "foo\n";' 1>testfile.xml 2>testfile.xml
$ cat testfile.xml 
1oo

使用2>&1,标准输出和标准错误都引用相同的打开文件句柄/描述符,并且它们不会相互覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.