2011-01-19 12 views
11

2つのファイルを操作するために設計されたいくつかのunixコマンドがあります。一般に、そのようなコマンドは、ファイル名の代わりに単一のダッシュを使用することによって、「ファイル」の1つの内容を標準入力から読み取ることができます。2つのファイルを標準入力にリダイレクト

私はちょうど両方のファイルを標準入力から読み込むことができるように思われるa techniqueに出くわした:

comm -12 <(sort file1) <(sort file2) 

私の最初信じない反応が動作してはならないこと」だった標準入力はただの連結を持つことになります。コマンドはファイルを区別することができず、2つのファイルの内容が与えられていることも分かりません。

もちろん、この構成は機能します。私はcommdiffの両方でcygwin 1.7.7でbash 3.2.51を使ってテストしました。私はどのように働いているのでしょうか、それがなぜ好奇心でしょうか:

  • なぜこれは機能しますか?
  • これはBashエクステンションですか、この直線的なBourneシェルの機能ですか?
  • これは私のシステムでは機能しますが、この手法は他のプラットフォームでも機能しますか? (言い換えれば、このテクニックを使って書かれたスクリプトは移植可能でしょうか?)

答えて

9

バッシュ、Kornシェルをし、Zは、すべてのサポートprocess substitutionシェル。これらはユーティリティのファイルとして表示されます。これを試してください:

$ bash -c 'echo <(echo)' 
/dev/fd/63 
$ ksh -c 'echo <(echo)' 
/dev/fd/4 
$ zsh -c 'echo <(echo)' 
/proc/self/fd/12 

表示されているものに似たファイル記述子が表示されます。

+0

これは処理の代替です!私はリダイレクトに関する情報のためにグーグルで多くの時間を過ごしましたが、間違った名前を付けました。 –

+0

ありがとうございます。これは助けになりました。確認済みのksh88(AIX 7.1)は、このスタイルのプロセス置換をサポートしていません。 bashのGaneshに感謝します。 –

4

これは標準のBash拡張です。 <(sort file1)sort file1コマンドの出力でパイプを開き、パイプに一時ファイル名を与え、その一時ファイル名をcommコマンドラインに渡します。

あなたはそれがプログラムに渡されています何を伝えるためにechoを取得することにより、どのように動作するかを確認できます(とにかく、は、ksh93)

echo <(sort file1) <(sort file2)