2016-07-15 96 views

回答

12

主要區別在於<( ... )被稱爲「進程替換」,被shell翻譯成文件名,該文件名作爲常規參數傳遞給該命令;它不會向命令的標準輸入發送任何內容。這意味着它不能直接用,如tr命令不採取文件名參數使用:

$ tr a-z A-Z <(echo hello) 
usage: tr [-Ccsu] string1 string2 
     tr [-Ccu] -d string1 
     tr [-Ccu] -s string1 
     tr [-Ccu] -ds string1 string2 

但是,你可以隨時把另一<<(面前...... )轉它變成一個輸入重定向來代替:

$ tr a-z A-Z < <(echo hello) 
HELLO 

而且因爲它會產生一個文件名,你可以使用與需要多個文件參數的命令進程替換:

$ diff -u <(echo $'foo\nbar\nbaz') <(echo $'foo\nbaz\nzoo') 
--- /dev/fd/63 2016-07-15 14:48:52.000000000 -0400 
+++ /dev/fd/62 2016-07-15 14:48:52.000000000 -0400 
@@ -1,3 +1,3 @@ 
foo 
-bar 
baz 
+zoo 

另一個顯著不同的是,一個管產生,其不能具有在父環境副作用子shell:

$ echo hello | read x 
$ echo $x 
# nothing - x is not set 

但隨着進程替換,只有括號內的過程是在子外殼;周圍的命令仍然可能有副作用:

$ read x < <(echo hello) 
$ echo $x 
hello 

值得一提的是,你還可以寫與>( ... )的過程,雖然有較少的情況下,這是有用的:

$ echo hello > >(cat) 
hello 
+0

哦,這真的很酷!謝謝你的迴應,這完美地回答了我的問題。 –

-4

a | b需要從可執行astdout輸出和飼料它可執行b爲b的stdin

a > ba執行stdout並將其重定向/寫入文件b

a < b需要文件b的內容並重定向/輸入到可執行a稱爲程序之間的其stdin

換句話說,|管道輸出,同時<>管道文件移入/移出程序。

()的版本運行一個額外的過程,同時完成基本相同的事情。

+3

無; '<(...)'符號不像您描述的那樣!它生成一個文件名;爲了重定向,你需要'<(...)' - 或'>>(...)'來輸出重定向。 –

+3

感謝您的迴應,但

相關問題