作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果:
另一个要避免的原因
| true
是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。
我们是否有办法找出管道缓冲区的大小?
我从来没有真正考虑过 shell 是如何实际执行管道命令的。我一直被告知“一个程序的标准输出通过管道传输到另一个程序的标准输入中”,这是对管道的一种思考方式。所以很自然地,我认为在 say 的情况下,A | B
,A
将首先运行,然后B
获取 的标准输出A
,并使用标准输出A
作为其输入。
但我注意到,当人们搜索特定的工艺ps
,他们会包括grep -v "grep"
在命令的末尾,以确保grep
不会出现在最终的输出。
这意味着在命令ps aux | grep "bash" | grep -v "grep"
中暗示ps
知道grep
正在运行,因此在ps
. 但是如果ps
在它的输出通过管道传输到 之前完成运行,它grep
怎么知道它grep
正在运行?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep
Run Code Online (Sandbox Code Playgroud)