x |之间的区别y和y <(x)在bash中?

问题描述:

command1 | command2command2 <(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 
+0

哦,这真的很酷!谢谢你的回应,这完美地回答了我的问题。 –

a | b需要从可执行astdout输出和饲料它可执行b为b的stdin

a > ba执行stdout并将其重定向/写入文件b

a < b需要文件b的内容并重定向/输入到可执行a称为程序之间的其stdin

换句话说,|管道输出,同时<>管道文件移入/移出程序。

()的版本运行一个额外的过程,同时完成基本相同的事情。

+3

无; '>(...)'来输出重定向。 –

+3

感谢您的回应,但