バックグラウンドプロセスパイプ入力

バックグラウンドプロセスパイプ入力

画面に「aaa」を表示するには:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

(3)と(4)の結論 - >分離されたプロセスには、まだ制御、使用、およびリダイレクトできる接続出力がありますが、入力はありません。

私の質問は:誰もが理解していますか?(5) 動作原理と動作原理???

... "<&0"は"0<&0"の略です。 0を0にリダイレクトすることが解決策である理由と、プロセス入力の分離の後に正確に何が起こっているのかを説明します。サブシェルは問題になりません。 (...)の代わりに中括弧{...}を使用すると、同じ結果が得られます。

...質問2:「分離されたプロセスに入力を提供する」ためのより良い解決策は、行(6)よりもありますか?

ベストアンサー1

はい、POSIXの要件によると、バックグラウンドで開始されたコマンドの標準入力が&からリダイレクトされます/dev/null

本当に

{ cmd <&3 3<&- & } 3<&0

この問題を解決する最も確実な方法です。

ただし、パイプラインの一部がバックグラウンドで実行される理由は不明です。

おすすめ記事