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
ただし、マニュアルページにデフォルトで値が返され、そのオプションを使用しないと、終了行が読み込まれることが示されていますが、起こります。cmd
bash
\n
-d delim
それで、次は-d delim
明示的に指定しようとしました。
$ read -d "\n" x < f`
それでも同じ結果です。
echo -n
FIFOのファイル「説明者」を閉じることは可能ですか?
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
できません。