为什么这两个“ cat”命令的结果不同?


12

假设infile包含特定文本,并且我要执行以下命令集:

执行 3<infile

猫-n <&3

猫-n <&3

cat的第一个实例将显示文件的内容,但是第二次似乎没有执行任何操作。他们为什么不同?

Answers:


29

它们看起来像同一条命令,但是它们不同的原因是系统状态由于第一个命令而发生了变化。具体来说,第一个cat文件消耗了整个文件,因此第二个文件cat没什么可读取的,立即命中了EOF(文件结尾)并退出。

这背后的原因是您对的两次调用都使用了完全相同的文件描述(使用该文件描述创建exec < infile并分配给了文件描述符3cat。与打开的文件描述相关的一件事情是文件偏移。因此,第一个cat读取整个文件,将偏移量留在末尾,而第二个则尝试从文件的末尾拾取,但没有发现要读取的内容。


12

只需添加@ jw013的好答案,它可能有助于认识到它与

{
   cat -n
   cat -n
} < infile

< file的缩写0< file,即使用文件描述符0而不是3。

为了使事情变得混乱,这个版本:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

行为不同取决于你在运行它的操作系统和对类型infile(常规文件VS管VS设备...)

在Solaris和大多数商业Unices上,an 大致open("/dev/fd/3")等于a dup(3)(因此< /dev/fd/3与大约相同<&3),而在Linux上,对于常规文件,它/dev/fd/3被实现为原始文件的符号链接,因此open("/dev/fd/3")从头开始重新打开它(并可能与fd 3的标志不同)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.