为什么我们自己打开文件描述符并重定向到stdin时只能使用1次?请看下面的例子来理解我想说的。使用 cat 命令读取一次后,不会通过同一文件描述符第二次读取该文件。
└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$
答案1
要打印文件,首先cat
必须读取它直到结束。
exec 6< input.txt
导致 shell 保留文件描述符,直到 shell 终止或关闭它,因此当调用第二个时,文件偏移量仍然指向文件的末尾cat
,因此不会向 stdout 写入任何内容。
如果在基于 Linux 的系统上,您可以通过查看文件描述符信息来看到发生的情况:
echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6
如果你执行该脚本,你会得到类似的结果
pos: 0
flags: 0100000
mnt_id: 113
File contents
pos: 14
flags: 0100000
mnt_id: 113
确认第二个执行时offset ( pos
) 不为 0 ,而是指向其末尾。cat
要重置偏移量,您可以在 sexec 6< input.txt
之间添加另一个偏移量cat
。