在诸如 之类的管道中command1 | command2
,
- 命令是否同时运行(即具有相同的生命周期),或者
- command2 在 command1 退出时开始运行,或者
- 还有别的东西吗?
当我听说命令进程形成一个进程组时,我的问题出现了。如果它们的生命周期不同,那么命令进程的进程组不是就没有意义了吗?
答案1
这些过程是开始了同时,并且将同时运行,但它们不必停止同时。当以下情况发生时,shell 将认为整个管道已终止(并显示新提示):两个都进程已终止。
如果在 docommand2
之前结束command1
(或关闭其标准输入流),然后command1
尝试写入输出,则该输出将无处可去。然后command1
会收到一个SIGPIPE
信号,其默认动作是 abort command1
。但command1
它本身可以覆盖此默认值,以便它继续运行。在这种情况下,它尝试写入输出将产生一个普通的 I/O 错误 ( EPIPE
),它可以根据需要做出反应。
答案2
“|”` 又名“管道”....管道让您可以使用一个程序的输出作为另一个程序的输入”。因此,如果我们这样做:
user$ cat SHAHashing.java | grep main
public static void main(String[] args)throws Exception
正如您所看到的,cat 首先执行显示页面内容 "THE OUTPUT" ,然后 grep 查找字符串 main 。
现在假设我输入错误CAT
如下:
user$ cats SHAHashing.java | grep main
-bash: cats: command not found
没有输出“错误的命令”,grep 将执行但无事可做。因此.... cats 导致第一个命令以状态“exit 1”终止。