Pode-se obter o valor de LINE_MAX
executando getconf LINE_MAX
. No FreeBSD 12 e Ubuntu 18.04 (e suspeito em muitos outros) esse valor é 2.048 bytes.
No mundo POSIX, existem muitos utilitários shell projetados especificamente para funcionar com arquivos de texto. Um arquivo que possui qualquer linha que exceda LINE_MAX
bytes de comprimento (nova linha inclusive) não é um arquivo de texto (conforme definido pelo POSIX de qualquer maneira). Um utilitário shell projetado para receber arquivos de texto como entrada não é necessário para poder lidar adequadamente com esse tipo de arquivo.
Na prática, parece que não consigo encontrar um utilitário que não consiga lidar com arquivos de texto com linhas muito longas. Entendo que os utilitários GNU não têm nenhum tipo de limite real para o tamanho de uma linha em um arquivo de texto (não tenho certeza sobre o FreeBSD).
Alguém conhece um utilitário shell em qualquer sistema operacional moderno ou semimoderno que engasga com linhas que excedem o LINE_MAX
comprimento de bytes? Além disso, linguagens de programação como Perl e Python são afetadas pelo valor de LINE_MAX
?
Responder1
Há pelo menos um exemplo de utilitário shell que segue LINE_MAX
, pelo menos em algumas circunstâncias, neste site,OpenBSDcut
; isso não aconteceestrangularem linhas mais longas que essas, mas algumas de suas capacidades são limitadas aos primeiros LINE_MAX
caracteres de uma linha.
Além das concessionárias que se recusam abertamente a trabalhar com linhas mais longas, existe um padrão comum que causará um comportamento potencialmente indesejado: a entrada é frequentemente processada usando
fgets(line, sizeof line, fp);
onde line
está uma LINE_MAX
matriz de caracteres de tamanho (veja por exemplopam_localuser
). Se line
for processado toda vez que fgets
retornar não- NULL
, a entrada será processada com linhas divididas em LINE_MAX
se forem muito longas. Assim, em pam_localuser
, uma linha /etc/passwd
mais longa que LINE_MAX
será tratada como duas linhas.
As linguagens de programação e geradores de analisadores que observei não têm nenhuma referência LINE_MAX
(além de referências de passagem, para disponibilizar o valor para programas escritos nessas linguagens). Isso inclui GCC, Perl, Python e Lua.