19

我有一个随机生成 10 个字符的密码的 shell 管道:

cat /dev/urandom | base64 | head -c 10

我的问题是cat /dev/urandom | base64一个无限的输出流,它不会自行退出。但是为什么附加head -c 10会使整个管道退出?我假设catbase64并且head是 3 个独立的进程,如何headcat进程退出?

4

3 回答 3

23

head读取所需数量后关闭输入文件。当管道从一侧关闭时,另一侧会出现写入错误;这导致base64关闭,这反过来又导致cat关闭。

于 2012-04-05T15:22:17.843 回答
13

base64输出 10 个字节后,head获得足够的输入并退出。当前者试图输出更多字节时,它会收到SIGPIPE 信号并因此退出。出于同样的原因,cat将依次退出。

于 2012-04-06T13:15:51.513 回答
4

管道通过将一个进程 A 的输出连接到 B 的输入来工作。连接可以断开,当

  • A 关闭其输出。B 将获得 EOF。
  • B 关闭其输入。A 在尝试写入下一个字节时将收到输出不再可用的错误。

由于这两种情况很常见,因此处理已移至 C 标准库中。

于 2012-04-05T15:23:27.873 回答