シェルを使用してパイプを作成すると、たとえば次のようになります。
ls | cat
私が確かに知っているのは、stdin
のcat
はstdout
のls
になるということです(つまり、ls
がstdout
に書き込むすべてのものは、cat
がstdin
を介して読み取ります)。
今私は2つの質問があります:
stdin
のls
はstdout
のcat
になりますか?stderr
とls
の両方のcat
は、パイプ演算子の影響を受けますか、それともシェルの継承されたstderr
値のままですか?技術的には、ls | cat
ls
(そのfd 1)の標準出力は、パイプ(または一部のシステムではksh93とのソケットペア)の書き込み終了になります。cat
(そのfd 0)のstdinは、同じパイプの読み取り終了になりますls
のstdinは影響を受けません(質問1)cat
のstdoutは影響を受けません(質問1)ls
またはcat
のstderr(fd 2)は影響を受けません(質問2)。ls
のstderrもパイプの書き込み側に移動するようにするには(つまり、cat
はパイプの反対側のstdinから読み取ることができます)、次のようにします。
ls 2>&1 | cat
つまり、「fd2がfd1と同じリソース(ここではパイプ)を指すようにします」
csh
、tcsh
、zsh
、またはbash
4.0以降では、次のように書くこともできます。
ls |& cat
パイプが双方向であるシステムでは、次のことができます。
ls <&1 | cat >&0
cat
のstdoutを同じパイプを介して逆方向にls
にフィードバックする必要がありますが、ls
がstdinから読み取ることはないため、これは無意味です。
パイプが双方向ではないLinuxでは、そのコマンドはエラーを出します。