cat 使用惰性求值吗?

Nic*_* Sm 0 linux shell bash ubuntu cat

例如,当使用管道时

sudo cat /dev/sda | strings | less
Run Code Online (Sandbox Code Playgroud)

我可以在我的 sda 设备的字符串中移动。但是sda设备的内容是不是全部加载完毕输出到cat的输出流了?或者每当程序请求 cat 的输出时都会评估新行?(即我在较少的寻呼机上按 j)

Kus*_*nda 5

这更多地与less工作方式有关,而不是与如何catstrings工作有关。

cat命令只会将数据推送到其标准输出,并且只要它之间的管道缓冲区strings已满并且没有人在读取它就会阻塞。 cat自己做最少的缓冲,管道缓冲区通常很小。

这对于strings. 它将处理来自的数据,cat并在less不读取strings产生的数据时阻塞。

less将缓冲其输入以允许您在它显示的数据中来回移动。当您滚动到下一页时,less将从strings其缓冲区中读取更多数据。虽然你不向前滚动,我相信less将只读取数据的数量有限(因此stringscat,而你不向前滚动将被阻止)。

如果您将大量数据通过管道传输到less并且您决定使用less.

有一个选项 ,-B它将用于缓冲的内存量限制为 64 KB(或您使用该-b选项指定的大小)。以这种方式限制缓冲区大小将防止您回滚超过指定缓冲区空间中可以存储的内容,但也将允许您在less不耗尽内存的情况下读取大量数据。

另请参阅man less您的系统。