私は同じことを期待してcat <(cat)
実行します。つまり、stdinからstdoutに行をコピーします。cat | cat
私の理解は、両方ともcat
サブシェルで1つを実行し、サブシェルcat
のstdoutを一時的な名前付きパイプにリダイレクトし、現在のシェルcat
で別のものを実行してそのstdinをパイプにリダイレクトすることです。
代わりにcat <(cat)
ターミナルに入力すると、入力ラインはコピーされずに^D
信号をエクスポートできませんが、EOF
期待cat | cat
どおりに機能します。
追加の実験でcat =(cat)
同様の困難があることを確認しましたが、cat <(cat)
期待どおりに機能しました。 aのすべてのstdinが^D
一度にstdoutにコピーされました。
誰でもzshが後ろから何をしているのかを理解するのに役立ちますか?
答え1
a | b
STDOUT
ただ使用しa
てSTDIN
接続してくださいb
dup/dup2
。どちらのコマンドも並列に実行されます。a =(b)
パラメータをa
一時ファイル名に変更します。一時ファイルが渡される前に作成される必要があるため、b
以前に実行されます。a
a
a <(b)
パラメータを名前付きパイプに置き換えますa
。a
そしてb
並列に実行します。これで状況はもう少し複雑になります。•
b
バックグラウンドにあるため、端末から読み取れません。strace -p $PID
プロセスを表示するには、2番目のcatプロセスに接続を使用して直接テストできます。•
a
また、名前付きパイプから読み取ろうとしましたが、b
読み取れないため、何も読み取れません。•これは、デフォルトではデッドロックに陥って
a
読み取りを試みますb
が、b
読み取れず、STDIN
書き込めないことを意味します。a
バックグラウンドプロセスと端末の詳細については、次を参照してください。男乱交:
タスク制御のためのユーザーインターフェースの実装を容易にするために、オペレーティングシステムは次の概念を維持します。現在の端末プロセスグループID。このプロセスグループのメンバー(現在の端末のプロセスグループIDと同じプロセスグループIDを持つプロセス)は、キーボードから生成された信号を受け取ります。例えば 知能を知らせる。このような過程を経るそうです展望。背景プロセスは、プロセスグループIDが端末のプロセスグループIDと異なるプロセスである。これらのプロセスはキーボードから生成された信号の影響を受けません。フォアグラウンドプロセスのみが端末を読み書きできます(ユーザーがstty tostopを使用して指定した場合)。端末から読み取り(およびstty tostopが適用されたときに書き込み)を試みるバックグラウンドプロセスが送信されます。シグトゥキャッチしないと、プロセスがハングするカーネルのターミナルドライバから発生する信号です。