Existem utilitários de shell em sistemas operacionais modernos do tipo Unix que não podem operar em arquivos de texto com linhas muito longas?

Existem utilitários de shell em sistemas operacionais modernos do tipo Unix que não podem operar em arquivos de texto com linhas muito longas?

Pode-se obter o valor de LINE_MAXexecutando 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_MAXbytes 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_MAXcomprimento 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_MAXcaracteres 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 lineestá uma LINE_MAXmatriz de caracteres de tamanho (veja por exemplopam_localuser). Se linefor processado toda vez que fgetsretornar não- NULL, a entrada será processada com linhas divididas em LINE_MAXse forem muito longas. Assim, em pam_localuser, uma linha /etc/passwdmais longa que LINE_MAXserá 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.

informação relacionada