文件和链接到文件的文件描述符之间的区别

Mar*_*tin 2 shell file-descriptors

我有一个包含四行的文件:

$ cat file
First line
Second line
Third line
Fourth line
$ 
Run Code Online (Sandbox Code Playgroud)

当我读这个文件四次时,我总是读第一行,这是预期的结果:

$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$ 
Run Code Online (Sandbox Code Playgroud)

但是,当我链接文件描述符 3file然后以相同的方式读取它时,每个读取都会“吃掉”输入流:

$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$
Run Code Online (Sandbox Code Playgroud)

为什么文件描述符有这样的行为?

小智 5

当您说:read var <file命令完成后文件描述符将关闭。因此,下一次循环中,文件描述符将重置为开头。

在这种情况下exec 3<file,当您说read -r -u 3 var即使读取命令完成并且读取位置已更新时,文件描述符仍保持打开状态,因此下次读取将抓取下一行。

注意:即使你已经这样做了,它exec 0<file仍然read -r var会有类似的行为。