有人能解释以下内容吗?
:~$ ls macreave.sh fgvdvg > testo 2> testo
:~$ cat testo
macreave.sh
ccess fgvdvg: No such file or directory
:~$ ls macreave.sh fgvdvg > testo 2>&1
:~$ cat testo
ls: cannot access fgvdvg: No such file or directory
macreave.sh
第一种方法会吃掉错误消息的前几个字符,第二种方法可以正常显示。这是为什么呢?
答案1
使用第二条命令
:~$ ls macreave.sh fgvdvg > testo 2>&1
您将导致 stderr 输出ls
被写入与 stdout( 2>&1
) 相同的文件描述符,并将 stdout 写入文件testo
:因此您有一个唯一的通量在您的文件中完成。
使用第一个命令
ls macreave.sh fgvdvg > testo 2> testo
您正在独立地重定向到同一个文件testo
。问题是管道和重定向可能不同步(请参阅这个答案也);您的文件中有 2 个通量都已完成并重新创建它。
看起来:
- 速度更快的是 stderror(几个字节),它创建一个文件
testo
(>
)并在里面写入ls:不能 - 然后它到达 stdout,重新创建相同的文件(
>
)删除里面的内容并将输出macreave.sh - 最后到达 stderr 的第二部分,将剩余的内容写入文件ccess fgvdvg:没有该文件或目录。
也许如果你再次执行,就会得到不同的结果。
参考