resultados mistos do mesmo comando (relacionado a ARG_MAX) [duplicado]

1

Estou fazendo uma pergunta com base neste link Como causar erro "Argument list too long"?

Do tópico, estou vendo o erro equivalente, se eu estiver executando isso:

>/bin/echo 'perl -e 'print "x" x 1000000''
/bin/echo: Argument list too long.

No entanto, se eu usar echo em vez de /bin/echo , não haverá erro, mesmo se eu excedesse muito além do ARG_MAX

>echo 'perl -e 'print "x" x 100000000''
xxxxxxxxxxx...

Aqui está meu ambiente

>which echo; getconf ARG_MAX
/bin/echo
2097152

Estou usando o tcsh.

    
por lionel319 23.11.2018 / 04:34

1 resposta

2

A diferença é que echo é um built-in do seu shell, enquanto /bin/echo é um executável externo.

A limitação em ARG_MAX está no syscall do kernel para executar um binário externo ( execve(2) .)

Ao executar um built-in em seu shell, tais limitações não são impostas pelo sistema, apenas limitações são do próprio shell, e a maioria dos shells simplesmente não impõe limites além da memória disponível para que eles armazenem os argumentos.

A propósito, neste caso, quando você está executando o /bin/echo externo, a limitação real que você está atingindo é ARG_MAX_STRLEN, que é o comprimento máximo de um argumento único , e no Linux na Intel é codificado para 131,072 bytes. Veja esta resposta para mais detalhes. ARG_MAX ainda é o limite para todos os argumentos (mais variáveis de ambiente, etc.) Mas cada argumento único é limitado por ARG_MAX_STRLEN. Portanto, mesmo se você encurtar sua expressão Perl para gerar um srring menor (como 132.000 caracteres), você ainda deve atingir esse limite específico.

    
por 23.11.2018 / 05:24