A limitação não está no shell, mas na família de funções exec()
.
O padrão POSIX diz em relação a este :
The number of bytes available for the new process' combined argument and environment lists is
{ARG_MAX}
. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
Para executar utilitários que são construídos no shell, o shell não precisará chamar exec()
, por isso não é afetado por esta limitação.
Note, também, que não é simplesmente o tamanho da linha de comando que é limitada, mas a combinação do comprimento do comando, seus argumentos e as variáveis de ambiente atuais e seus valores.
Observe também que printf
não é um utilitário incorporado em, por exemplo, pdksh
(que funciona como sh
e ksh
no OpenBSD). Baseando-se em ser um built-in terá que levar em conta o shell específico que está sendo usado.