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を待ちます。

可能簡単な例を使用することは(ただしデッドロックとマイナーなバッファリングの問題が発生する可能性があります)、すべてを飲み込むことなくパイプから行を取得する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"

おすすめ記事