Существуют ли какие-либо утилиты оболочки в современных Unix-подобных операционных системах, которые не могут работать с текстовыми файлами с очень длинными строками?

Существуют ли какие-либо утилиты оболочки в современных Unix-подобных операционных системах, которые не могут работать с текстовыми файлами с очень длинными строками?

Значение of можно получить, LINE_MAXзапустив getconf LINE_MAX. В FreeBSD 12 и Ubuntu 18.04 (и, я подозреваю, во многих других) это значение составляет 2048 байт.

В мире POSIX существует множество утилит оболочки, специально разработанных для работы с текстовыми файлами. Файл, в котором есть хотя бы одна строка, LINE_MAXдлина которой превышает байт (включая перевод строки), не является текстовым файлом (по крайней мере, как определено в POSIX). Утилита оболочки, разработанная для приема текстовых файлов в качестве входных данных, не обязана правильно обрабатывать этот тип файлов.

На практике я, похоже, не могу найти утилиту, которая не может работать с текстовыми файлами с действительно длинными строками. Насколько я понимаю, утилиты GNU не имеют никаких реальных ограничений на длину строки в текстовом файле (не уверен насчет FreeBSD).

Кто-нибудь знает утилиту оболочки на любой современной или полусовременной операционной системе, которая подавляется строками, LINE_MAXдлина которых превышает байты? Кстати, влияет ли значение LINE_MAX? на языки программирования вроде Perl и Python?

решение1

На этом сайте есть по крайней мере один пример утилиты оболочки, которая придерживается LINE_MAX, по крайней мере в некоторых обстоятельствах,OpenBSDcut; это не такдушитьна строках длиннее, но некоторые его возможности ограничены первыми LINE_MAXсимволами строки.

Помимо утилит, которые наотрез отказываются работать с более длинными линиями, существует общая схема, которая может вызвать потенциально нежелательное поведение: ввод часто обрабатывается с использованием

fgets(line, sizeof line, fp);

где line- LINE_MAXмассив символов размером - (см. напримерpam_localuser). Если lineобрабатывается каждый раз, когда fgetsвозвращает не- NULL, то входные данные будут обработаны с разделением строк, LINE_MAXесли они слишком длинные. Таким образом pam_localuser, в строка /etc/passwdдлиннее LINE_MAXбудет обработана как две строки.

Языки программирования и генераторы парсеров, которые я рассматривал, не имеют ссылки на LINE_MAX(кроме сквозных ссылок, чтобы сделать значение доступным для программ, написанных на этих языках). Сюда входят GCC, Perl, Python и Lua.

Связанный контент