如何在 bash 中创建环回文件描述符?

如何在 bash 中创建环回文件描述符?

我希望能够将数据写入文件描述符,然后稍后在 bash 中读回。

这看起来像:

# some line to create LOOPBACK_FD
echo foo >${LOOPBACK_FD}
cat <${LOOPBACK_FD}
# foo is printed

我知道我可以使用变量来存储命令的输出,例如:

MYMESSAGE=$(echo foo)
echo ${MYMESSAGE}

memfd_create做某事喜欢我想要什么,但文件偏移量可能有问题,而且 bash 似乎根本不使用它。

也许有一种特殊的设备可以做到这一点?

编辑:我正在寻找一种不需要在文件系统中创建新节点的解决方案。

答案1

echo foo >${LOOPBACK_FD}
cat <${LOOPBACK_FD}

这是行不通的——无论它LOOPBACK_FD是如何创建或打开的,或者是否可以通过文件系统访问。

cat只要调用脚本(正在等待cat终止)保持管道的写入端打开,就会一直等待EOF,而 EOF 就不会到来。

一些东西可能使用简单的示例(但会遇到死锁和任何不平凡的缓冲问题)正在使用read而不是cat仅从管道中获取一行,而无需尝试将其全部吞掉。

编辑:我正在寻找一种不需要在文件系统中创建新节点的解决方案。

Linux 中没有“匿名”管道;即使那些使用pipe(2)系统调用或|在 shell 中创建的也可以通过/proc/{pid}/fd/{fd}或访问/proc/self/fd/{fd};他们将要始终在文件系统中“创建”一个新节点。

但是您可以使用该功能打开输入管道的写入端(反之亦然),这可以为您的 XY 问题提供“聪明”的答案:

#! /bin/bash
exec {fd}< <(:) {fd}<>/proc/self/fd/$fd

echo eenie >&$fd
read message <&$fd; echo "$message"

echo meenie >&$fd
read message <&$fd; echo "$message"

相关内容