ファイルディスクリプタにデータを書き込んでから、後で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を待ちます。
何可能簡単な例を使用することは(ただしデッドロックとマイナーなバッファリングの問題が発生する可能性があります)、すべてを飲み込むことなくパイプから行を取得するread
代わりに使用することです。cat
編集:ファイルシステムに新しいノードを作成する必要のないソリューションを探しています。
Linuxには「匿名」パイプはありません。pipe(2)
システムコールを使用するか、|
シェルから生成されたパイプ/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"