¿Existen utilidades de shell en sistemas operativos modernos tipo Unix que no puedan funcionar con archivos de texto con líneas muy largas?

¿Existen utilidades de shell en sistemas operativos modernos tipo Unix que no puedan funcionar con archivos de texto con líneas muy largas?

Se puede obtener el valor de LINE_MAXejecutando 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_MAXlos 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_MAXlos 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_MAXcaracteres 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 linehay una LINE_MAXmatriz de caracteres de tamaño (ver por ejemplopam_localuser). Si linese procesa cada vez que fgetsdevuelve non- NULL, entonces la entrada se procesará con líneas divididas en LINE_MAXsi son demasiado largas. Por lo tanto, en pam_localuser, una línea /etc/passwdmás larga LINE_MAXse 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.

información relacionada