【发布时间】:2012-12-04 03:14:36
【问题描述】:
有什么区别
cat dat | tee >(wc -l ) | some other command
和
cat dat | tee file | wc -l
就幕后发生的事情而言? 我可以理解第二个,因为 tee 将流分叉到文件中,也分叉到管道中。但我对第一个感到困惑。
【问题讨论】:
有什么区别
cat dat | tee >(wc -l ) | some other command
和
cat dat | tee file | wc -l
就幕后发生的事情而言? 我可以理解第二个,因为 tee 将流分叉到文件中,也分叉到管道中。但我对第一个感到困惑。
【问题讨论】:
第一个符号是 Bash 4.x 的 process substitution(不在 3.x 中,或者不是在 3.x 的所有版本中)。
就tee而言,它被赋予了一个文件名(例如/dev/fd/64),它可以写入到标准输出中;它实际上是管道写入端的文件描述符。就wc 而言,它读取其标准输入(对于tee,它是连接到/dev/fd/64 的管道的读取端),并将其答案写入调用管道的shell 的标准输出(不是tee 的标准输出)。
【讨论】:
$(command) 替换称为 'command substitution'。不同之处在于,一般来说,每个命令替换都会扩展到程序的多个参数,而每个process substitution 会导致程序的单个参数。举个小例子:ls $(echo *.*) 生成许多文件名参数,而ls <(echo *.*) 会给ls 一个参数(当我尝试ls <(echo *.*) 时它响应/dev/fd/63!)。
因为 >( 是 bash 的进程替代, 第一行说: 将文件“dat”的内容发送到其他命令 而进程'wc'以其输入或输出运行 连接到也发送“dat”内容的管道
检查 bash 手册页的“进程替换”。
【讨论】: