A diferença é que echo
é um built-in do seu shell, enquanto /bin/echo
é um executável externo.
A limitação em ARG_MAX está no syscall do kernel para executar um binário externo ( execve(2)
.)
Ao executar um built-in em seu shell, tais limitações não são impostas pelo sistema, apenas limitações são do próprio shell, e a maioria dos shells simplesmente não impõe limites além da memória disponível para que eles armazenem os argumentos.
A propósito, neste caso, quando você está executando o /bin/echo
externo, a limitação real que você está atingindo é ARG_MAX_STRLEN, que é o comprimento máximo de um argumento único , e no Linux na Intel é codificado para 131,072 bytes. Veja esta resposta para mais detalhes. ARG_MAX ainda é o limite para todos os argumentos (mais variáveis de ambiente, etc.) Mas cada argumento único é limitado por ARG_MAX_STRLEN. Portanto, mesmo se você encurtar sua expressão Perl para gerar um srring menor (como 132.000 caracteres), você ainda deve atingir esse limite específico.