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.)