命令 `ls 2 >tmp >tmp` 和命令 `ls > tmp` 之间的区别

命令 `ls 2 >tmp >tmp` 和命令 `ls > tmp` 之间的区别

我不明白黑白ls 2>tmp >tmp和 的区别是什么ls > tmp。它们看起来本质上都做同样的事情,创建一个文件 tmp 并存储命令的结果ls

答案1

简短的回答:ls 2>tmp >tmpstdout和重定向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

相关内容