por que o loop não aumenta o erro "argumento muito longo"?

9

Descobri que isso aumentaria o erro "argumento muito longo":

ls *.*

E isso não aumentaria:

for file in *.*
do
    echo $file
done

Por quê?

    
por lamwaiman1988 14.09.2011 / 10:00

3 respostas

13

O erro "argumento muito longo" é E2BIG , gerado pelo execve chamada de sistema se o tamanho total dos argumentos (mais o ambiente, em alguns sistemas) for muito grande. A chamada execve é aquela que inicia processos externos, carregando especificamente um arquivo executável diferente (há uma chamada diferente, fork , para executar um processo separado cujo código ainda é do mesmo arquivo executável). O for loop é uma construção de shell interna, portanto, não envolve chamar execve . O comando ls *.* gera o erro não quando o glob é expandido, mas quando ls é chamado.

execve falha com o erro E2BIG quando o tamanho total dos argumentos para o comando é maior que o ARG_MAX limit . Você pode ver o valor desse limite em seu sistema com o comando getconf ARG_MAX . (É possível que você ultrapasse esse limite se tiver memória suficiente; manter sob ARG_MAX garante que execve funcionará, desde que não ocorra nenhum erro não relacionado.)

    
por 15.09.2011 / 02:23
5

Suponho que no primeiro exemplo ls é executado de bash através de uma chamada de sistema fork / exec , no segundo, todo o trabalho é interno para bash .

A chamada exec tem limites, o trabalho interno de bash não tem (ou melhor, tem limites diferentes que não têm nada a ver com exec , talvez a quantidade de memória disponível).

    
por 14.09.2011 / 10:25
5

Porque no caso de ls é um argumento e o número de argumentos é limitado.

No caso do ciclo for , é apenas uma lista de itens. Não há limites (até onde sei) para isso.

    
por 14.09.2011 / 12:25

Tags