Bash内建函数定义为:
shell 直接执行命令,而不调用另一个程序。
类似管道的foo | bar
工作方式大致如下:bar
等待来自 的输入foo
,foo
然后先退出,然后bar
退出。
在 bash 中,这样的管道按预期工作:
$ history | grep curl
但是如何才能grep
知道history
它的工作已经完成并退出呢?因为history
,它是一个内置的,没有产生新的进程。会history
产生EOF
信号还是什么?
Bash内建函数定义为:
shell 直接执行命令,而不调用另一个程序。
类似管道的foo | bar
工作方式大致如下:bar
等待来自 的输入foo
,foo
然后先退出,然后bar
退出。
在 bash 中,这样的管道按预期工作:
$ history | grep curl
但是如何才能grep
知道history
它的工作已经完成并退出呢?因为history
,它是一个内置的,没有产生新的进程。会history
产生EOF
信号还是什么?
当手册说“不调用另一个程序”时,这意味着外壳不
execve
用于执行另一个程序。当命令使用重定向时,简单的实现是到fork
另一个进程并只为该进程执行重定向,而不修改父 shell 的文件描述符。这也是bash
这个命令的作用,可以用strace
.可以做一些诡计并避免内部命令的分叉,但在这种情况下似乎没有使用它们。
第二个程序无法检测到第一个程序退出,它只能检测到管道的输出端已经关闭(这可能是因为程序退出,也可能是因为一个常规的
close
)。管道的读取端将收到 EOF。管道中的第一个程序首先退出是常见的但不是必需的。考虑:
如果管道的第二个程序在第一个程序之前退出并且第一个程序尝试写入管道,它将获得信号
SIGPIPE
,这将终止进程,除非它被捕获。