12

superuser.comの投稿の回答では、次のことがわかります。

join <(sort abc) <(sort bcd)

参加するために送信する前に、ファイルabcとbcdをソートします。これは、スタックオーバーフローにより適したプログラミングの問題につながります。

これはどのように作動しますか?この<()構成は正確には何ですか?それは何と呼ばれていますか?

(sort abc)がabcでsortを実行し、出力を返す正当な呼び出しである場合、なぜ必要なの<ですか?

つまり、次の2行は同等です

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)

しかし

join (sort abc) (sort bcd)

構文エラーです。手がかりを教えてください!

4

2 に答える 2

21

これはプロセス置換と呼ばれます。

<(list)は単一の構文構造であり、この場合、「<」文字は別個の記号ではありません。listを実行し、その出力を一種のファイル(標準のリダイレクトではない)としてコマンドに提供します。

これは実行と同等です(可能な場合は一時ファイルの代わりにパイプを使用することを除いて):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2

両方の種類の出力は、標準のリダイレクトとしてではなく、結合するファイル名として提供されることに注意してください。

(list)別の目的のために、別の構成です。listを実行するサブシェルを作成し、その標準記述子を親シェルに提供するだけです。

これがbashマニュアルの関連部分です。

于 2009-08-19T13:01:14.753 に答える
6

<(command)プロセス置換です(の対応するセクションを参照man bash)。基本的に、コマンドが実行され、その出力が名前付きパイプ(FIFO)に送られ、構成全体がパイプの名前に置き換えられるため、結果はになります。join /dev/fd/x /dev/fd/y

于 2009-08-19T13:03:12.117 に答える