我希望能够将数据写入文件描述符,然后稍后在 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"