我对 bash 中的管道如何工作感到困惑。以随机字符串生成器为例:
tr -dc 'A-Z0-9' </dev/urandom
产生的tr
进程读取/dev/urandom无限期地,直到/dev/urandom提供输出,直到有东西中断它。现在采取这个:
tr -dc 'A-Z0-9' </dev/urandom | fold -w 8 | head -n 1
立即输出看似不确定的大写字母数字字符的第一行,每行折叠为 8 个符号。即生成 8 个随机大写字母数字字符。从角度来看,我有一种直觉head
:它等待第一行,并且这是它从其开始等待的唯一事情标准输入。
man bash
说:
管道中的每个命令都作为单独的进程(即在子shell 中)执行。
究竟如何head
告诉fold
我们tr
这就足够了?是否fold
向进程发送终止信号tr
?或者是一些更复杂的行为,比如 sayhead
的/dev/标准输入指向与 相同的fold
流/dev/标准输出,当head
关闭流时,fold
得到终止信号?当这些子 shell 堆叠成这样的管道时,会发生什么?
还有一个附带问题:我应该如何编写 bash 脚本,以便它们在堆叠在管道中时正常工作?