重定向 shell

重定向 shell

有人能解释以下内容吗?

:~$ 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:没有该文件或目录

也许如果你再次执行,就会得到不同的结果。

参考

相关内容