J'avais l'impression que la longueur maximale d'un seul argument n'était pas le problème ici, mais plutôt la taille totale du tableau d'arguments global plus la taille de l'environnement, qui est limité à ARG_MAX
. Ainsi, j'ai pensé que quelque chose comme ce qui suit pourrait réussir:
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
En - 100
plus d’être suffisant pour prendre en compte la différence entre la taille de l’environnement dans le shell et le echo
processus. Au lieu de cela, j'ai eu l'erreur:
bash: /bin/echo: Argument list too long
Après avoir joué pendant un moment, j'ai trouvé que le maximum était d'un ordre de grandeur hexagonal plus petit:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
Lorsque le moins un est supprimé, l'erreur revient. Apparemment, le maximum pour un seul argument est en fait ARG_MAX/16
et les -1
comptes de l'octet nul placés à la fin de la chaîne dans le tableau d'arguments.
Un autre problème est que lorsque l'argument est répété, la taille totale du tableau d'arguments peut être plus proche de ARG_MAX
, mais pas encore tout à fait là:
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; do
args+=( ${args[0]} )
done
/bin/echo "${args[@]}" "${args[0]:6534}" >/dev/null
Utiliser "${args[0]:6533}"
ici rallonge le dernier argument d'un octet et donne l' Argument list too long
erreur. Il est peu probable que cette différence soit prise en compte par la taille de l'environnement:
$ cat /proc/$$/environ | wc -c
1045
Des questions:
- Ce comportement est-il correct ou existe-t-il un bogue quelque part?
- Si non, ce comportement est-il documenté quelque part? Existe-t-il un autre paramètre définissant le maximum pour un seul argument?
- Ce comportement est-il limité à Linux (ou même à des versions particulières de ce type)?
- Qu'est-ce qui explique l'écart de ~ 5 Ko supplémentaire entre la taille maximale réelle du tableau d'arguments plus la taille approximative de l'environnement et
ARG_MAX
?
Information additionnelle:
uname -a
Linux graeme-rock 3.13-1-amd64 #1 SMP Debian 3.13.5-1 (2014-03-04) x86_64 GNU/Linux
getconf ARG_MAX
dépend du courant ulimit -s
. Réglez-le à illimité et obtenez un incroyable 4611686018427387903 pour ARG_MAX.