gpt4 book ai didi

linux - 为什么管道进入 BASH 命令组有时会起作用?

转载 作者:太空狗 更新时间:2023-10-29 11:40:45 24 4
gpt4 key购买 nike

我已经使用以下命令一段时间来将 header 保留在 ps 输出上。

ps aux | { head -1; grep root; }

输出将如下所示。

USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root 142 0.0 0.0 1234567 2520 ?? Ss 3:14AM 0:08.03 /usr/sbin/notifyd
root 55 0.0 0.0 7890123 2460 ?? Ss 3:14AM 0:01.94 /usr/sbin/syslogd
...

但是,当与其他命令行程序一起使用时,输出与预期不同。

以下面的df为例。

df -h

输出如下。

Filesystem      Size  Used Avail Use% Mounted on
/dev/disk1s1 466G 103G 362G 22% /
/dev/disk1s4 466G 1.1G 362G 1% /blah/blah/blah

在与上述 ps 示例类似的语法中使用 df

df -h | { head -1; grep disk1; }

输出如下。

Filesystem      Size  Used Avail Use% Mounted on

期望输出看起来与直接的 df -h 命令基本相同。

为什么这与 ps 不同?

我觉得了解这些差异将有助于我更全面地理解 BASH 处理。

谢谢!

最佳答案

这是因为 head 正在缓冲它的输入。它从管道读入一个大缓冲区,然后开始从该缓冲区中提取行。在读取并打印前 N 行后,它退出。然后 grep 开始从管道读取数据。但是 head 已经读入其缓冲区的任何内容都不可用。

它似乎与 ps 一起工作的原因是因为它产生大量输出,不适合这个缓冲区。 grep 然后能够处理剩余的输出。但我认为如果你仔细检查,你会发现结果是不完整的。

df 的输出要小得多,它都适合 head 使用的缓冲区,所以没有什么可以留给 grep 处理.

缓冲区大小大概是 4K 个字符。

你可以用 awk 做你想做的事:

df -h | awk 'NR == 1 || /disk1/'
ps aux | awk 'NR == 1 || /root/'

NR 是行号,因此如果它是第一行或者它与正则表达式匹配,则打印该行。

关于linux - 为什么管道进入 BASH 命令组有时会起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49957757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com