2016-07-15 97 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

感谢您的回应,但

相关问题