x |之间的区别y和y <(x)在bash中?
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
换句话说,|
管道输出,同时<
和>
管道文件移入/移出程序。
与()
的版本运行一个额外的过程,同时完成基本相同的事情。
无; '>(...)'来输出重定向。 –
感谢您的回应,但
哦,这真的很酷!谢谢你的回应,这完美地回答了我的问题。 –