现代类 Unix 操作系统上是否有任何 shell 实用程序无法操作具有很长行的文本文件?

现代类 Unix 操作系统上是否有任何 shell 实用程序无法操作具有很长行的文本文件?

LINE_MAX可以通过运行来获取 的值getconf LINE_MAX。在 FreeBSD 12 和 Ubuntu 18.04(我怀疑还有很多其他操作系统)上,该值是 2048 字节。

在 POSIX 世界中,有许多专门设计用于处理文本文件的 shell 实用程序。任何一行长度超过字节(包括换行符)的文件LINE_MAX都不是文本文件(无论如何都是由 POSIX 定义的)。设计用于将文本文件作为输入的 shell 实用程序不需要能够正确处理此类文件。

在实践中,我似乎无法找到一个无法处理行数很长的文本文件的实用程序。据我了解,GNU 实用程序对文本文件中一行的长度没有任何实际限制(我不确定 FreeBSD)。

有人知道任何现代或半现代操作系统上的 shell 实用程序会在LINE_MAX长度超过字节的行上阻塞吗?顺便说一句,像 Perl 和 Python 这样的编程语言会受到 的值的影响吗LINE_MAX

答案1

至少在某些情况下,此站点上至少有一个 shell 实用程序的示例LINE_MAX,该实用程序至少在某些情况下坚持使用 ,开放BSDcut;事实并非如此比这些更长的行,但它的某些功能仅限于LINE_MAX行的第一个字符。

除了完全拒绝使用较长线路的实用程序之外,还有一种常见模式会导致潜在的不良行为:通常使用

fgets(line, sizeof line, fp);

其中lineLINE_MAX- 大小的字符数组(参见示例pam_localuser)。如果line每次处理都fgets返回 non- NULL,则输入将LINE_MAX在行太长时进行分割处理。因此,在 中pam_localuser/etc/passwd长度大于的行将LINE_MAX被视为两行。

我查看的编程语言和解析器生成器没有引用LINE_MAX(除了传递引用之外,以使值可用于用这些语言编写的程序)。这包括 GCC、Perl、Python 和 Lua。

相关内容