Se puede obtener el valor de LINE_MAX
ejecutando getconf LINE_MAX
. En FreeBSD 12 y Ubuntu 18.04 (y sospecho que muchos otros) este valor es 2048 bytes.
En el mundo POSIX, existen muchas utilidades de shell que están diseñadas específicamente para trabajar con archivos de texto. Un archivo que tiene una línea que excede LINE_MAX
los bytes de longitud (nueva línea incluida) no es un archivo de texto (como lo define POSIX de todos modos). No se requiere una utilidad de shell diseñada para tomar archivos de texto como entrada para poder manejar adecuadamente este tipo de archivos.
En la práctica, parece que no puedo encontrar una utilidad que no pueda manejar archivos de texto con líneas muy largas. Tengo entendido que las utilidades GNU no tienen ningún tipo de límite real en cuanto a la longitud que puede tener una línea en un archivo de texto (no estoy seguro acerca de FreeBSD).
¿Alguien conoce una utilidad de shell en algún sistema operativo moderno o semimoderno que se bloquea en líneas que exceden LINE_MAX
los bytes de longitud? Además, ¿los lenguajes de programación como Perl y Python se ven afectados por el valor de LINE_MAX
?
Respuesta1
Hay al menos un ejemplo de una utilidad de shell que se adhiere LINE_MAX
, al menos en algunas circunstancias, en este sitio,OpenBSDcut
; no lo haceahogoen líneas más largas que esas, pero algunas de sus capacidades se limitan a los primeros LINE_MAX
caracteres de una línea.
Además de las empresas de servicios públicos que se niegan rotundamente a trabajar con líneas más largas, existe un patrón común que provocará un comportamiento potencialmente no deseado: la entrada a menudo se procesa utilizando
fgets(line, sizeof line, fp);
¿Dónde line
hay una LINE_MAX
matriz de caracteres de tamaño (ver por ejemplopam_localuser
). Si line
se procesa cada vez que fgets
devuelve non- NULL
, entonces la entrada se procesará con líneas divididas en LINE_MAX
si son demasiado largas. Por lo tanto, en pam_localuser
, una línea /etc/passwd
más larga LINE_MAX
se tratará como dos líneas.
Los lenguajes de programación y los generadores de analizadores que examiné no tienen ninguna referencia LINE_MAX
(aparte de las referencias de paso, para que el valor esté disponible para los programas escritos en esos lenguajes). Esto incluye GCC, Perl, Python y Lua.