たとえば、シェルを使用してパイプを作成する場合:
ls | cat
私が確信しているのはstdin
forがforにcat
なるということです(つまり、ここに書かれているすべての内容はそれを通して読まれます)。stdout
ls
ls
stdout
cat
stdin
今、2つの質問があります。
- について
stdin
ですか?ls
stdout
cat
stderr
両方に該当し、ls
パイプcat
演算子の影響を受けますか、それでもstderr
シェルから値を継承しますか?
答え1
技術的に言えば、ls | cat
- (fd 1)は
ls
パイプ(または一部のシステムではksh93を持つソケットペア)の書き込みの終わりです。 - stdin(fd 0) は
cat
同じパイプの読み取り終了になります。 - 両方のコマンドが同時に実行されます(別々のプロセスで同時に起動されます)。
- stdin
ls
は影響を受けません(問題1)。 - stdout
cat
は影響を受けません(問題1)。 - stderr(fd 2)
ls
またはcat
影響を受けません(問題2)。
ls
stderr がパイプの書き込み端に移動するようにするには (cat
パイプのもう一方の端の stdin から読み取れるように)、次のようにします。
ls 2>&1 | cat
「fd 2がfd 1と同じリソースを指すようにします(ここでパイプ)。」
csh
、tcsh
またはバージョン4.0以降では、次のように書くこともできますzsh
。bash
ls |& cat
パイプが双方向のシステムでは、次のことができます。
ls <&1 | cat >&0
の標準出力は同じパイプを介して反対方向にフィードバックされますが、cat
標準入力を読み取らないため、これは意味がありません。ls
ls
Linuxでは、パイプは双方向ではないため、コマンドでエラーが発生します。