答案1
你用:
consumer <(feeder)
为了输出offeeder
被馈送到consumer
, whenconsumer
无法从 stdin 获取输入(在这种情况下,您只需使用feeder | cousumer
),但只能从作为参数给出的文件名获取输入。
在这种情况下,feeder
的输出是管道的写入端, 的扩展<(feeder)
是一个文件名(通常/dev/fd/<x>
,尽管在不支持的系统上可能是命名管道/dev/fd/<n>
),一旦打开(由consumer
),您将进入阅读该管子的末端。
对称地,您使用:
feeder >(consumer)
对于那些feeder
不将其输出发送到 stdout(您可以再次执行此操作feeder | consumer
),而是发送到需要将其名称作为参数传递的文件的命令。
然后consumer
的输入是管道的读取端,并>(consumer)
扩展为文件名,一旦打开(通过feeder
)即可到达该管道的写入端。
它更常用,<(...)
因为它在需要多个输入的命令中很有用,例如:
diff -u <(cmd1) <(cmd2)
虽然命令产生多个输出或命令无法将其输出发送到 stdout 的情况不太常见。一个常见的例外是:
feeder | tee >(consumer1) >(consumer2) | consumer3
其中tee
是一个典型的命令,它将一些输出并行发送到多个文件(除了 stdout 之外)。
您可能见过这样的事情:
tar cf - somedir |
gzip -9 |
tee >(shasum > dir.tgz.shasum) >(md5sum > dir.tgz.md5sum) > dir.tgz
将输出gzip
(此处为压缩的 tar 存档)发送到输出文件,并shasum
同时md5sum
生成和存储校验和。