web-dev-qa-db-ja.com

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

画面に「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)よりも優れています。

14
Asain Kujovic

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

本当に

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

それを回避する最も明白な方法です。

ただし、パイプラインの一部をバックグラウンドで実行する理由は明確ではありません。

12