![Definir uma variável de ambiente longa interrompe muitos comandos](https://rvso.com/image/109248/Definir%20uma%20vari%C3%A1vel%20de%20ambiente%20longa%20interrompe%20muitos%20comandos.png)
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 doexecve
chamada 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.