将命令管道传输到子shell中。

3
什么是它们之间的区别?
cat dat | tee >(wc -l ) | some other command

并且

cat dat | tee file | wc -l

就底层正在发生的事情而言,我能理解第二个命令是将流分叉到文件和管道中。但是我对第一个命令感到困惑。
2个回答

3
第一个符号是Bash 4.x的进程替换符号(不适用于3.x,或3.x的所有版本)。
至于tee命令,它被给定一个文件名(例如/dev/fd/64),它会将输出写入该文件以及标准输出;实际上它是一个管道写端的文件描述符。对于wc命令而言,它读取标准输入(即连接到/dev/fd/64的管道的读端),并将其答案写入调用管道的shell的标准输出(而不是tee的标准输出,后者会传递到管道中)。

谢谢您的回答。如果我可以再问一个问题,进程替换和在括号前面加上美元符号的那种(我不知道它的名称)有什么不同?例如,var = $(basename file)可以正常工作,但var =(basename file)却不能。为什么会这样? - Alby
$(command) 替换被称为 '命令替换'。不同之处在于,通常每个命令替换会扩展为程序的多个参数,而每个进程替换则会导致程序的单个参数。举个简单的例子:ls $(echo *.*) 会生成许多文件名参数,而 ls <(echo *.*) 则会给 ls 一个单一的参数(当我尝试 ls <(echo *.*) 时,它回应 /dev/fd/63!)。 - Jonathan Leffler
我发现这个参考链接对于理解进程替换非常有帮助:http://tldp.org/LDP/abs/html/process-sub.html - Carl

1

由于>(是bash的进程替换), 第一行表示: 将文件“dat”的内容发送到其他某个命令, 同时运行带有其输入或输出的进程'wc' 连接到一个管道,该管道还会发送'dat'的内容

请查看bash手册中的“进程替换”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接