相关疑难解决方法(0)

管道命令以什么顺序运行?

我从来没有真正考虑过 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)

pipe ps

109
推荐指数
3
解决办法
3万
查看次数

将千兆字节的数据写入管道时会发生什么?

假设我有一个名为 的makefile,hour_long_recipe顾名思义,它需要一个小时才能运行。在整个食谱的随机点上,它会问是/否问题。假设它总共问了 10 个问题。

一种可能(并且经常被推荐)的运行方式是:

yes | make hour_long_recipe
Run Code Online (Sandbox Code Playgroud)

用 回答所有问题y。但是,根据我的理解,无论是否实际使用来自其标准输入的数据,都会yes高达每秒 10.2 GiB 的速度输出到标准输出make

即使它只有 10 MiB/s(比任何yes可以相信的 reddit 线程的实现都慢得多),在一小时内它会加起来超过 35 GiB,其中只有 20 个字节将被读取。数据去哪儿了?可以将其保存到磁盘,但这很浪费,如果磁盘填满的速度足够快,它甚至可能导致make失败。

据推测,操作系统会阻止它到达那个状态,但是如何呢?什么是限制,达到该限制时会发生什么?

linux pipe yes

18
推荐指数
1
解决办法
1731
查看次数

标签 统计

pipe ×2

linux ×1

ps ×1

yes ×1