bash:fifoからレコード全体を読み込みます。

bash:fifoからレコード全体を読み込みます。

FIFO経由でプロセスBからプロセスAにコマンドを送信したいと思います。

コマンドは単語または文ですが、「\n」で終わる行には完全に含まれていますが、他の文字で終わる複数行のレコードでもかまいません。

私が試したコードの関連部分は次のとおりです。

プロセスA:

$ mkfifo ff
$ read x < ff

プロセスB: (他の端末ウィンドウで)

$ echo -n "cmd"   > ff
$ echo -n " arg1" > ff
$ echo -n " arg2" > ff
 ...    
$ echo    " argN" > ff

readただし、マニュアルページにデフォルトで値が返され、そのオプションを使用しないと、終了行が読み込まれることが示されていますが、起こります。cmdbash\n-d delim

それで、次は-d delim明示的に指定しようとしました。

$ read -d "\n" x < f`

それでも同じ結果です。

echo -nFIFOのファイル「説明者」を閉じることは可能ですか?

Ubuntu 18.04でbash 4.4.xを使用しています。

答え1

はい、まさにそのようなことが起こりました:

$ mkfifo p
$ while :; do cat p ; done > /dev/null  & 
$ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3)                                = 0
--
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3)                                = 0

リダイレクトは、それを設定する個々のコマンドの実行中にのみ適用されます。書き込み側の回避策は、a)複合ブロックを使用してコマンドをグループ化するか、b)スクリプトexec全体の期間(または閉じるまで)開かれたファイル記述子を使用することです。

ㅏ)

{ echo -n foo; echo bar; } > p

(関数にコマンドを入れて関数を呼び出すときにリダイレクトを使用することもできます。)

雨)

exec 3>p
echo -n foo >&3
echo bar    >&3
exec 3>&-         # to explicitly close it

読者側で問題を解決するには、read取得した文字列を繰り返してリンクする必要があります。部分的に行ではなくファイルの終了条件を明示的にスキップしたいので、終了コードを使用して役に立つことはreadできません。

関連情報