gpt4 book ai didi

linux - Bash 读/写文件描述符——寻找文件的开始

转载 作者:IT王子 更新时间:2023-10-28 23:56:11 27 4
gpt4 key购买 nike

我尝试在 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 来实现我想要的?

最佳答案

我在 bash 中找到了一种方法,但它依赖于 exec < /dev/stdin 的一个模糊特性这实际上可以根据 http://linux-ip.net/misc/madlug/shell-tips/tip-1.txt 倒回 stdin 的文件描述符:

F=$(mktemp)
exec 3<> "$F"
rm -f "$F"

echo "Hello world" >&3
{ exec < /dev/stdin; cat; } <&3

写入描述符不受此影响,因此您仍然可以在 cat 之前将输出附加到描述符 3。

可悲的是,即使使用最新的 bash 版本,我也只能在 Linux 而不是 MacOS (BSD) 下使用它。所以它看起来不太便携。

关于linux - Bash 读/写文件描述符——寻找文件的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com