我试图在bash中使用读/写文件描述符,以便可以删除文件描述符之后引用的文件,例如:
F=$(mktemp) exec 3<> "$F" rm -f "$F" echo "Hello world" >&3 cat <&3
但是该cat命令没有输出。如果我使用单独的文件描述符进行读写,则可以实现我想要的:
cat
F=$(mktemp) exec 3> "$F" exec 4< "$F" rm -f "$F" echo "Hello world" >&3 cat <&4
打印Hello world。
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来实现我想要的功能?
不,bash的重定向没有任何“寻求”的概念。它以长流从头到尾进行读取/写入(大部分)。