Definir uma variável de ambiente longa interrompe muitos comandos

Definir uma variável de ambiente longa interrompe muitos comandos

Tenho visto um comportamento estranho ao mexer nas variáveis ​​de ambiente. Estou configurando uma variável de ambiente muito longa e isso impede o lançamento de qualquer comando:

( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )

$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long

O que esta acontecendo aqui ?

Responder1

A lista de argumentos e o ambiente de um comando são copiados no mesmo espaço da memória quando um programa é iniciado. A mensagem de erro é “Lista de argumentos muito longa”, mas na verdade o erro exato é que a lista de argumentos mais o ambiente são muito longos.

Isso acontece como parte doexecvechamada do sistema. A maioria, senão todas as variantes do Unix, têm um limite no tamanho desse espaço temporário. A razão para esse limite é evitar que um programa malicioso ou com bugs faça com que o kernel use uma grande quantidade de memória fora do espaço de memória do próprio programa.

OPadrão POSIXespecifica que o tamanho máximo deste espaço de memória deve ser pelo menos ARG_MAX, e que ovalor mínimodisso ( _POSIX_ARG_MAX) é 4096. Na prática, a maioria das variantes do Unix permite mais do que isso, mas não 10 MB. Você pode verificar o valor em seu sistema com getconf ARG_MAX. Nos sistemas Linux modernos, o máximo é 2 MB (com configurações típicas). Tradicionalmente, muitos sistemas tinham um limite de 128kB. O Linux também ainda tem umLimite de 128kB para o valor de um único argumento ou a definição de uma variável de ambiente.

Se você precisar passar mais do que algumas centenas de bytes de informação, passe-os em um arquivo.

informação relacionada