进程替换中 (commands) 之间的区别

进程替换中 (commands) 之间的区别

流程替代我可以看到两种语法:

>(command_list)

<(command_list)

我经常使用第二种语法。但我不知道两者到底有什么区别?搜索并没有什么特别的结果。

答案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生成和存储校验和。

相关内容