bash: / usr / bin / perl: lista de argumentos muito longa

3

Alguém pode explicar o que está acontecendo aqui:

$ export a
$ a='perl -e 'print "z"x1000000''
$ a='perl -e 'print "z"x1000000''
bash: /usr/bin/perl: Argument list too long
$ a='perl -e 'print "z"x1000000''
$ a='perl -e 'print "z"x1000000''
bash: /usr/bin/perl: Argument list too long

(O perl one liner faz uma string contendo 1000000 zs). Por que a linha de comando é muito longa para cada segundo executado?

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Editar

Parece que a falha na execução não ajusta $ a. O limite parece ser 131070. Menor do que isso, não há erro.

    
por Ole Tange 18.01.2015 / 02:11

1 resposta

6

É o limite do tamanho dos argumentos e das variáveis de ambiente passadas para execve .

  • POSIX especificá-lo através de ARG_MAX .
  • Linux anterior ao kernel 2.6.23, o limite para 32 páginas ( MAX_ARG_PAGES ). Com um tamanho de página de 4 kB, o limite é de 128 kB.
  • Linux kernel 2.6.23 e posterior, o limite é 1/4 do tamanho de pilha permitido.

Observe que também há um limite para o comprimento máximo e o número de sequências transmitidas para execve . É hard-coded em fonte linux e é aplicado independentemente do tamanho de pilha permitido.

Você pode ver man 2 execve para mais detalhes.

Na segunda execução, o processo Perl não é iniciado, portanto, a substituição de comando 'perl …' produz saída vazia e a é definida como um valor vazio, reduzindo o ambiente a um tamanho pequeno. Em seguida, o terceiro comando é bem-sucedido e define o ambiente próximo ao limite de tamanho, e assim por diante.

Para mais clareza, você pode tentar export a; a=$(yes | head -c128k) , então nenhum outro comando externo pode ser executado.

    
por 18.01.2015 / 07:31

Tags