$ 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
。
したがって、あなたの質問に答えると、echo
2つのパラメータ123
の合計が得られたため、この出力が得られます/dev/fd/63
。プロセス置換では、/dev/fd/63
プロセスの標準入力に関連付けられたファイルです。cat
サンプルコードを少し修正してください。
$ echo 101 > >(cat)
これは101
標準出力としてのみ生成されます(の出力はecho
入力として使用されるファイルにリダイレクトされ、cat
そのcat
ファイルの内容は標準出力として生成されます)。
また、cmd1 | cmd2
パイプラインではcmd2
同じシェルでまったく実行されない可能性がありますcmd1
(使用しているシェルの実装によって異なります)。 ksh93
説明どおりに動作します(同じシェル)。bash
サブシェルの作成中cmd2
(lastpipe
シェルオプションが設定され、ジョブ制御が有効になっていない場合)