我用猫和重定向进行了一些测试,有些行为我不明白。
我知道当你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。
我只是想知道为什么在这种情况下它的表现如此。 感谢。
答案 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"。