stdin、stdout、stderrに対するシェルパイプ演算子の効果

stdin、stdout、stderrに対するシェルパイプ演算子の効果

たとえば、シェルを使用してパイプを作成する場合:

ls | cat

私が確信しているのはstdinforがforにcatなるということです(つまり、ここに書かれているすべての内容はそれを通して読まれます)。stdoutlslsstdoutcatstdin

今、2つの質問があります。

  1. についてstdinですか?lsstdoutcat
  2. stderr両方に該当し、lsパイプcat演算子の影響を受けますか、それでもstderrシェルから値を継承しますか?

答え1

技術的に言えば、ls | cat

  • (fd 1)はlsパイプ(または一部のシステムではksh93を持つソケットペア)の書き込みの終わりです。
  • stdin(fd 0) はcat同じパイプの読み取り終了になります。
  • 両方のコマンドが同時に実行されます(別々のプロセスで同時に起動されます)。
  • stdinlsは影響を受けません(問題1)。
  • stdoutcatは影響を受けません(問題1)。
  • stderr(fd 2)lsまたはcat影響を受けません(問題2)。

lsstderr がパイプの書き込み端に移動するようにするには (catパイプのもう一方の端の stdin から読み取れるように)、次のようにします。

ls 2>&1 | cat

「fd 2がfd 1と同じリソースを指すようにします(ここでパイプ)。」

cshtcshまたはバージョン4.0以降では、次のように書くこともできますzshbash

ls |& cat

パイプが双方向のシステムでは、次のことができます。

ls <&1 | cat >&0

の標準出力は同じパイプを介して反対方向にフィードバックされますが、cat標準入力を読み取らないため、これは意味がありません。lsls

Linuxでは、パイプは双方向ではないため、コマンドでエラーが発生します。

関連情報