众所周知,将标准输出和错误重定向到同一文件cmd >out_err.txt 2>out_err.txt可能会导致数据丢失,如下例所示:
work:/tmp$ touch file.txt
work:/tmp$ ls another_file.txt
ls: cannot access 'another_file.txt': No such file or directory
Run Code Online (Sandbox Code Playgroud)
以上是示例的设置代码。空文件file.txt存在并且another_file.txt不是一个东西。在下面的代码中,我天真地重定向到out_err.txt列出这些文件的输入和输出操作系统。
work:/tmp$ ls file.txt another_file.txt >out_err.txt 2>out_err.txt
work:/tmp$ cat out_err.txt
file.txt
t access 'another_file.txt': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我们看到错误流中丢失了一些字符。然而,>>从复制示例的意义上来说,使用有效会保留整个输出和整个错误。
为什么以及如何cmd >>out_err.txt 2>>out_err.txt运作?