【问题标题】:command pipe into subshell命令管道进入子shell
【发布时间】:2012-12-04 03:14:36
【问题描述】:

有什么区别

cat dat | tee >(wc -l ) | some other command

cat dat | tee file | wc -l

就幕后发生的事情而言? 我可以理解第二个,因为 tee 将流分叉到文件中,也分叉到管道中。但我对第一个感到困惑。

【问题讨论】:

    标签: unix tee


    【解决方案1】:

    第一个符号是 Bash 4.x 的 process substitution(不在 3.x 中,或者不是在 3.x 的所有版本中)。

    tee而言,它被赋予了一个文件名(例如/dev/fd/64),它可以写入到标准输出中;它实际上是管道写入端的文件描述符。就wc 而言,它读取其标准输入(对于tee,它是连接到/dev/fd/64 的管道的读取端),并将其答案写入调用管道的shell 的标准输出(不是tee 的标准输出)。

    【讨论】:

    • 感谢您的回答。如果我可以再问一个问题,进程替换与括号前面带有美元符号的进程替换有何不同,例如 $(command)(我不知道它的名称)?例如, var=$(basename file) 可以正常工作,但 var=(basename file) 不能。为什么会这样?
    • $(command) 替换称为 'command substitution'。不同之处在于,一般来说,每个命令替换都会扩展到程序的多个参数,而每个process substitution 会导致程序的单个参数。举个小例子:ls $(echo *.*) 生成许多文件名参数,而ls <(echo *.*) 会给ls 一个参数(当我尝试ls <(echo *.*) 时它响应/dev/fd/63!)。
    • 我发现这个参考对理解进程替换很有帮助:tldp.org/LDP/abs/html/process-sub.html
    【解决方案2】:

    因为 >( 是 bash 的进程替代, 第一行说: 将文件“dat”的内容发送到其他命令 而进程'wc'以其输入或输出运行 连接到也发送“dat”内容的管道

    检查 bash 手册页的“进程替换”。

    【讨论】: