从FD 3读取指向临时文件时的“错误文件描述符”

时间:2019-03-30 20:20:36

标签: bash

我的问题是受this SO answer启发的。

考虑脚本:

tmpfile=$(mktemp)
exec 3>"$tmpfile"
rm "$tmpfile"

>&3 cat <<EOS
line 1
line 2
line 3
EOS

cat <&3

您可以play with it online here

我希望它能打印出3行,但实际上我收到“错误文件描述符”错误。

为什么上述方法不起作用?如何对其进行更改才能做到?

注意:即使删除第三行rm "$tmpfile",该错误仍然存​​在。

1 个答案:

答案 0 :(得分:6)

您仅打开文件描述符3进行写入,而不是读取。将该行更改为

exec 3<>"$tmpfile"

错误的文件描述符错误将消失。

但是,cat <&3仍然不会产生任何输出,因为文件指针在上一次写入之后仍位于文件的末尾。您需要返回到文件的开头以输出您刚刚编写的内容,但是bash没有提供查找的方法。最好的办法是通过关闭并重新打开文件描述符3或打开另一个文件描述符来重新打开文件以进行读取。

由于目标是在删除唯一链接后读取文件,因此在删除文件之前,您必须打开另一个文件描述符进行读取。

tmpfile=$(mktemp)
exec 3> "$tmpfile"
exec 4< "$tmpfile"

rm "$tmpfile"

>&3 cat <<EOS
line 1
line 2
line 3
EOS

cat <&4

尽管3和4都引用同一个文件,但是它们各自维护一个单独的文件指针。无需打开3进行阅读和写作。您可以在描述符3上写入文件,然后从描述符4读取内容。