Значение 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.