/ dev / stdout,/ dev / stderr cat重定向(意外行为)

时间:2017-06-27 17:02:39

标签: macos unix zsh

我用猫和重定向进行了一些测试,有些行为我不明白。 我知道当你cat /dev/stdout/dev/stderr时,它会告诉cat从终端读取(比如没有参数的猫)。 但是为什么当我做

cat /dev/stdout > file.txt

我获得了权限被拒绝:cat: /dev/stdout: Permission denied(对我而言,它应该像cat /dev/stdout一样没有重定向并输出到file.txt)但是当我这样做时:

cat /dev/stderr > file.txt

什么写得很好,文件.txt,它一定不是没有?并且 为什么

cat /dev/stderr 2> file.txt

什么都没做?但

cat /dev/stderr 2>&2 > file.txt

重定向到file.txt。

我只是想知道为什么在这种情况下它的表现如此。 感谢。

1 个答案:

答案 0 :(得分:2)

它的操作顺序。

shell重定向发生在shell中,因为它正在设置环境来执行命令。 /dev/stdout然而只是一个文件名(字符串),它作为参数传递给命令,而根本不由shell处理。

因此,当您运行cat /dev/stdout > file.txt时,shell首先打开file.txt进行写入,然后更改stdout以引用该文件描述符,然后使用cat作为参数运行/dev/stdout程序。 然后,cat程序会尝试打开/dev/stdout进行阅读。

现在/dev/stdout不是真正的文件 - 它通常只是/dev/fd/1的符号链接,它可以是设备专用文件,也可以是自定义开发文件系统上的内容,因此打开涉及调用设备驱动程序中的特殊例程,它尝试将stdout文件描述符复制为具有读取权限的新文件描述符。问题是stdout是一个文件描述符,引用带有写privedges的file.txt,但没有读权限,因此你得到一个" Permission Denied"。