Quando executo um comando como ls */*/*/*/*.jpg
, recebo o erro
-bash: /bin/ls: Argument list too long
Eu sei por que isso acontece: é porque há um limite de kernel na quantidade de espaço para argumentos em um comando. O conselho padrão é alterar o comando que eu uso, para evitar exigir muito espaço para argumentos (por exemplo, use find
e xargs
).
E se eu não quiser mudar o comando? E se eu quiser continuar usando o mesmo comando? Como faço para que as coisas "funcionem" sem obter esse erro? Que soluções estão disponíveis?
Respostas:
No Linux, a quantidade máxima de espaço para argumentos de comando é 1/4 da quantidade de espaço disponível na pilha. Portanto, uma solução é aumentar a quantidade de espaço disponível para a pilha.
Versão curta: execute algo como
Versão mais longa: a quantidade padrão de espaço disponível para a pilha é algo como 8192 KB. Você pode ver a quantidade de espaço disponível, da seguinte maneira:
Escolha um número maior e defina a quantidade de espaço disponível para a pilha. Por exemplo, se você quiser tentar permitir até 65536 KB para a pilha, execute o seguinte:
Talvez você precise brincar com o tamanho que isso precisa ser, usando tentativa e erro. Em muitos casos, esta é uma solução rápida e suja que irá eliminar a necessidade de modificar o comando e trabalho fora a sintaxe
find
,xargs
etc. (embora eu percebo que há outros benefícios para fazê-lo).Eu acredito que isso seja específico do Linux. Eu suspeito que provavelmente não ajudará em nenhum outro sistema operacional Unix (não testado).
fonte
Este artigo do Linux Journal fornece 4 soluções. Somente a quarta solução não envolve a alteração do comando:
Concordo que a limitação é seriamente irritante.
fonte
Em vez de
ls */*/*/*/*.jpg
, tente:xargs
(1) sabe qual é o número máximo de argumentos no sistema e interromperá sua entrada padrão para chamar a linha de comando especificada várias vezes, sem mais argumentos que esse limite, qualquer que seja (você também pode configurá-lo abaixo de máximo do sistema operacional usando a-n
opção).Por exemplo, suponha que o limite seja de 3 argumentos e você tenha cinco arquivos. Nesse caso,
xargs
será executadols
duas vezes:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Geralmente isso é perfeitamente adequado, mas nem sempre - por exemplo, você não pode confiar em
ls
(1) classificar todas as entradas para você corretamente, porque cadals
convite -in separado separará apenas o subconjunto de entradas atribuído a elexargs
.Embora você possa aumentar o limite conforme sugerido por outras pessoas, ainda haverá um limite - e um dia sua coleção de JPG superará isso novamente. Você deve preparar seu script para lidar com um número infinito ...
fonte
Argument list too long
, mas emecho
vez dels
, em shells ondeecho
não há um comando interno do shell? (Talvez isso não é um problema na maioria dos shells, talvez isso é irrelevante.)find
com o-print0
predicado - e canalizar sua saídaxargs
com a-0
opçãoecho
é um shell interno e não sofre com a limitação da linha de comando deexec
(3).