【发布时间】:2010-10-01 10:23:49
【问题描述】:
我尝试在bash中使用读/写文件描述符,以便我可以删除文件描述符之后引用的文件,例如:
F=$(mktemp)
exec 3<> "$F"
rm -f "$F"
echo "Hello world" >&3
cat <&3
但是cat 命令没有输出。如果我使用单独的文件描述符进行读写,我可以实现我想要的:
F=$(mktemp)
exec 3> "$F"
exec 4< "$F"
rm -f "$F"
echo "Hello world" >&3
cat <&4
打印Hello world。
我怀疑当你从写入切换到读取时,bash 不会自动寻找文件描述符的开头,以下 bash 和 python 代码的组合证实了这一点:
fdrw.sh
exec 3<> tmp
rm tmp
echo "Hello world" >&3
exec python fdrw.py
fdrw.py
import os
f = os.fdopen(3)
print f.tell()
print f.read()
给出:
$ bash fdrw.sh
12
$ # This is the prompt reappearing
有没有办法只使用 bash 来实现我想要的?
【问题讨论】:
-
为什么要在读/写之前删除文件?
-
在 Unix 中,当您删除一个文件时,该文件实际上并没有被删除,直到它的所有打开的文件描述符都被关闭。因此,在打开临时文件后立即删除是一种常见做法,因为它保证没有其他进程可以恶意更改文件,并且在您的进程关闭文件或退出后关闭文件。
-
你为什么不喜欢你自己的拥有独立读写描述符的方法呢?这似乎是最简单的方法。
标签: linux bash unix file-io read-write