command1 | command2
與command2 <(command1)
有什麼區別?x |之間的區別y和y <(x)在bash中?
例如,git diff | more
VS more <(git diff)
我的理解是,無論採取command2
標準輸出和管道它的command1
標準輸入。
command1 | command2
與command2 <(command1)
有什麼區別?x |之間的區別y和y <(x)在bash中?
例如,git diff | more
VS more <(git diff)
我的理解是,無論採取command2
標準輸出和管道它的command1
標準輸入。
主要區別在於<(
... )
被稱爲「進程替換」,被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
a | b
需要從可執行a
的stdout
輸出和飼料它可執行b
爲b的stdin
。
a > b
從a
執行stdout
並將其重定向/寫入文件b
。
a < b
需要文件b
的內容並重定向/輸入到可執行a
稱爲程序之間的其stdin
換句話說,|
管道輸出,同時<
和>
管道文件移入/移出程序。
與()
的版本運行一個額外的過程,同時完成基本相同的事情。
無; '<(...)'符號不像您描述的那樣!它生成一個文件名;爲了重定向,你需要'<(...)' - 或'>>(...)'來輸出重定向。 –
感謝您的迴應,但
哦,這真的很酷!謝謝你的迴應,這完美地回答了我的問題。 –