我不明白黑白ls 2>tmp >tmp
和 的区别是什么ls > tmp
。它们看起来本质上都做同样的事情,创建一个文件 tmp 并存储命令的结果ls
。
答案1
简短的回答:ls 2>tmp >tmp
将stdout
和重定向stderr
到文件tmp
。而ls > tmp
仅重定向stdout
到 file tmp
。
试试这个看看有什么不同:
$ ls asdsadasd 2>tmp >tmp
$ cat tmp
ls: cannot access asdsadasd: No such file or directory
$ ls asdsadasd > tmp
ls: cannot access asdsadasd: No such file or directory
$ cat tmp
<Nothing happen here>
答案2
请注意,您不应该这样做:
ls 2> tmp > tmp
上面的 shell 打开tmp
以在文件描述符 2 上写入,然后tmp
再次打开以在文件描述符 1 上写入,然后执行ls
.你会有两个文件描述符指向同一文件的两个单独的打开文件描述。
如果ls
同时写入其文件描述符 1(文件列表的 stdout)和文件描述符 2(错误消息的 stderr),这些输出将相互覆盖(假设tmp
是常规文件而不是命名管道)。
实际上,stdout 输出将被缓冲,因此更有可能在退出前写入末尾ls
,因此它会覆盖 stderr 输出。
例子:
$ ls /x /etc/passwd 2> tmp > tmp
$ cat tmp
/etc/passwd
ccess /x: No such file or directory
你应该使用:
ls > tmp 2>&1
或者
ls 2> tmp >&2
在这种情况下,shelltmp
在 fd 2 上打开,然后将该 fd 复制到 fd 1 上,因此 fd 1 和 2 将共享相同的打开文件描述,tmp
并且输出不会相互覆盖。
$ ls /x /etc/passwd 2> tmp >&2
$ cat tmp
ls: cannot access /x: No such file or directory
/etc/passwd