2011-01-19 94 views
11

有幾個unix命令可以在兩個文件上運行。通常這樣的命令允許通過使用單個破折號代替文件名從標準輸入中讀取其中一個「文件」的內容。將兩個文件重定向到標準輸入

我只是碰到a technique似乎允許從標準輸入讀取這兩個文件來:

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

我最初不相信的反應是,「這不應該工作標準輸入只會有串聯這兩個文件,命令將不能分辨文件,甚至不能意識到它已經被賦予了兩個文件的內容。「

當然,這種結構確實有效。我已經在cygwin 1.7.7上使用bash 3.2.51對commdiff進行了測試。我很好奇它是如何以及它爲什麼起作用的:

  • 這是爲什麼這樣工作?
  • 這是Bash擴展,還是直Bourne shell功能?
  • 這對我的系統有效,但這種技術是否可以在其他平臺上工作? (換句話說,使用這種技術編寫的腳本是否便攜?)

回答

9

的Bash,Korn shell程序(ksh93的,反正)和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

就是這樣 - 過程替代!我花了很多時間搜索重定向信息,但我的名字錯了。 – 2011-01-20 14:28:51

4

這是一個標準的Bash擴展。 <(sort file1)使用sort file1命令的輸出打開管道,爲管道提供臨時文件名,並在comm命令行上傳遞該臨時文件名。

你可以看到它是如何工作的通過讓echo告訴你什麼正在傳遞給程序:

echo <(sort file1) <(sort file2) 
相關問題