Ok, habitantes. Portanto, já há algum tempo aceitei os limites de comprimento de linha de comando como verdade. Então, o que fazer com as suposições de alguém? Naturalmente, verifique-os.
Tenho uma máquina Fedora 22 à minha disposição (ou seja: Linux com bash4). Eu criei um diretório com 500.000 inodes (arquivos) em cada um de 18 caracteres. O comprimento da linha de comando é de 9.500.000 caracteres. Criado assim:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
E notamos:
$ getconf ARG_MAX
2097152
No entanto, posso fazer isso:
$ echo * > /dev/null
Mas isso falha:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Posso executar um loop for:
$ for f in *; do :; done
que é outro shell embutido.
Leitura cuidadosa da documentação paraARG_MAX
estados, comprimento máximo do argumento para as funções exec . Isso significa: Sem chamar exec
, não há ARG_MAX
limitação. Portanto, isso explicaria por que os builtins do shell não são restritos por ARG_MAX
.
E, de fato, posso conseguir ls
meu diretório se minha lista de argumentos tiver 1.09948 arquivos ou cerca de 2.089.000 caracteres (mais ou menos). Depois de adicionar mais um arquivo de nome de arquivo de 18 caracteres, no entanto, recebo um erro Lista de argumentos muito longa . Portanto, ARG_MAX
está funcionando conforme anunciado: o exec está falhando com mais de ARG_MAX
caracteres na lista de argumentos - incluindo, deve-se observar, os dados do ambiente.