zshのcat <(cat)とcat | catとcat =(cat)の違いは何ですか?

zshのcat <(cat)とcat | catとcat =(cat)の違いは何ですか?

私は同じことを期待して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

  1. a | bSTDOUTただ使用しaSTDIN接続してくださいbdup/dup2。どちらのコマンドも並列に実行されます。

  2. a =(b)パラメータをa一時ファイル名に変更します。一時ファイルが渡される前に作成される必要があるため、b以前に実行されます。aa

  3. a <(b)パラメータを名前付きパイプに置き換えますaaそしてb並列に実行します。これで状況はもう少し複雑になります。

    bバックグラウンドにあるため、端末から読み取れません。strace -p $PIDプロセスを表示するには、2番目のcatプロセスに接続を使用して直接テストできます。

    aまた、名前付きパイプから読み取ろうとしましたが、b読み取れないため、何も読み取れません。

    •これは、デフォルトではデッドロックに陥ってa読み取りを試みますbが、b読み取れず、STDIN書き込めないことを意味します。a

バックグラウンドプロセスと端末の詳細については、次を参照してください。男乱交:

タスク制御のためのユーザーインターフェースの実装を容易にするために、オペレーティングシステムは次の概念を維持します。現在の端末プロセスグループID。このプロセスグループのメンバー(現在の端末のプロセスグループIDと同じプロセスグループIDを持つプロセス)は、キーボードから生成された信号を受け取ります。例えば 知能を知らせる。このような過程を経るそうです展望背景プロセスは、プロセスグループIDが端末のプロセスグループIDと異なるプロセスである。これらのプロセスはキーボードから生成された信号の影響を受けません。フォアグラウンドプロセスのみが端末を読み書きできます(ユーザーがstty tostopを使用して指定した場合)。端末から読み取り(およびstty tostopが適用されたときに書き込み)を試みるバックグラウンドプロセスが送信されます。シグトゥキャッチしないと、プロセスがハングするカーネルのターミナルドライバから発生する信号です。

関連情報