我的问题是受this SO answer启发的。
考虑脚本:
tmpfile=$(mktemp)
exec 3>"$tmpfile"
rm "$tmpfile"
>&3 cat <<EOS
line 1
line 2
line 3
EOS
cat <&3
我希望它能打印出3行,但实际上我收到“错误文件描述符”错误。
为什么上述方法不起作用?如何对其进行更改才能做到?
注意:即使删除第三行rm "$tmpfile"
,该错误仍然存在。
答案 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读取内容。