現代類 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。

相關內容