「echo 123>(cat)」出力に「/dev/fd/63」があるのはなぜですか?

「echo 123>(cat)」出力に「/dev/fd/63」があるのはなぜですか?
$ echo 123 | cat 
123

私が期待どおりに実行しています。両方のコマンドが同じシェルで実行されています。

>( ... )ただし、シェルの1つのコマンド出力をサブシェルの2番目のコマンドに関連付ける式を使用してそれを連結すると、次の結果が得られます。

$ echo 123 >(cat)
123 /dev/fd/63

他の値にも同様に適用されます。

$ echo 101 >(cat)
101 /dev/fd/63

$ echo $BASHPID >(cat)
3252 /dev/fd/63

command1 >(command2)と同じだと思いますcommand1 | command2が、command1 >(command2)各コマンドは異なるシェル内にあるので、同じ出力を持つ必要があります。私はどこで間違っていますか?

ベストアンサー1

プロセス置換は>(thing)ファイル名で置き換えられます。ファイル名は、thing内部的に置き換えられる標準入力に接続されたファイルに対応します。

以下は、その使用のより良い例です。

$ sort -o >(cat -n >/tmp/out) ~/.profile

その後、ファイルがソートされ、~/.profile出力がcat -nその出力に送信され、行が列挙され、結果が/tmp/out

したがって、あなたの質問に答えると、echo2つのパラメータ123の合計が得られたため、この出力が得られます/dev/fd/63。プロセス置換では、/dev/fd/63プロセスの標準入力に関連付けられたファイルです。cat

サンプルコードを少し修正してください。

$ echo 101 > >(cat)

これは101標準出力としてのみ生成されます(の出力はecho入力として使用されるファイルにリダイレクトされ、catそのcatファイルの内容は標準出力として生成されます)。


また、cmd1 | cmd2パイプラインではcmd2同じシェルでまったく実行されない可能性がありますcmd1(使用しているシェルの実装によって異なります)。 ksh93説明どおりに動作します(同じシェル)。bashサブシェルの作成中cmd2(lastpipeシェルオプションが設定され、ジョブ制御が有効になっていない場合)

おすすめ記事