Usar getconf ARG_MAX
para gerar uma lista longa de x
e chamar um utilitário externo com isso como seu argumento geraria um erro "Argument list too long":
$ /bin/echo $( perl -e 'print "x" x $ARGV[0]' "$(getconf ARG_MAX)" )
/bin/sh: /bin/echo: Argument list too long
O ambiente e o comprimento da string /bin/echo
serão incluídos no que faz o erro ocorrer, portanto, podemos tentar encontrar o maior número possível subtraindo-os:
$ env
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
(Eu iniciei este shell com env -i sh
, portanto, há apenas a variável PATH
no ambiente)
$ /bin/echo $( perl -e 'print "x" x ($ARGV[0] - length($ENV{"PATH"}) - length("/bin/echo"))' "$(getconf ARG_MAX)" )
sh: /bin/echo: Argument list too long
Ainda é muito longo. Por quanto?
i=0
while ! /bin/echo $( perl -e 'print "x" x ($ARGV[0] - length($ENV{"PATH"}) - length("/bin/echo") - $ARGV[1])' "$(getconf ARG_MAX)" "$i" )
do
i=$(( i + 1 ))
done
Esse loop sai por i=8
.
Portanto, há quatro bytes que não posso explicar de imediato (quatro dos oito devem ser para o nome da variável de ambiente PATH
). Estes são os terminadores nulos para as quatro cadeias PATH
, o valor de PATH
, /bin/echo
e a longa cadeia de caracteres x
.
Note que o argumento each é terminado em null, então quanto mais argumentos você tiver para o comando, mais curto o comprimento combinado deles pode ser.
Além disso, apenas para mostrar o efeito de um ambiente grande:
$ export BIG=$( perl -e 'print "x" x $ARGV[0]' "$( getconf ARG_MAX )" )
$ /bin/echo hello
sh: /bin/echo: Argument list too long
$ /bin/echo
sh: /bin/echo: Argument list too long