当我运行以下命令时:
exec 3<<< "TEST"
我可以看到以下内容出现在/proc
(注意有关 FD3 读取的最后一行已删除):
# ls -al /proc/$$/fd
total 0
dr-x------ 2 root root 0 Jan 18 21:09 .
dr-xr-xr-x 9 root root 0 Jan 18 21:09 ..
lrwx------ 1 root root 64 Jan 28 16:22 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 18 21:09 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 255 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 28 20:42 3 -> /tmp/sh-thd-1123912022914878506 (deleted)
我可以读取 FD 3 的内容一次,但之后就无法再读取了:
# cat 0<&3
TEST
# cat 0<&3
# cat 0<&3
我的问题是,如果/proc/$$/fd/3
它已经被读为“已删除”,那么为什么我仍然可以阅读其内容背后的理论是什么?
答案1
您仍然可以从文件描述符中读取。问题是您正在使用“dup2”系统调用来对文件描述符进行第二次引用,并且文件描述符有一个位置。在你的第一只猫之后,该位置位于数据的末尾。您可以一次读取一点数据(这里我read
以一次读取一行为例,通常您会使用 read -r),并且我使用 perl 作为将位置倒回到开头的简单方法文件的。
$ exec 3<<<'This is some text
> and some more
> that is all folks'
$ read <&3 ; echo "$REPLY"
This is some text
$ read <&3 ; echo "$REPLY"
and some more
$ perl -e 'sysseek(stdin,0,0);' <&3
$ read <&3 ; echo "$REPLY"
This is some text
答案2
答案3
您尚未关闭该文件描述符,因此尚未释放其资源。但是,您已经读取了该文件描述符上可用的所有内容。未来的读取将立即获得 EOF,但文件描述符尚未关闭,因此它仍然存在。