Avevo l'impressione che la lunghezza massima di un singolo argomento non fosse il problema qui tanto quanto la dimensione totale dell'array di argomenti generale più la dimensione dell'ambiente, che è limitata a ARG_MAX
. Quindi ho pensato che qualcosa di simile al seguente avrebbe avuto successo:
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
Con l' - 100
essere più che sufficiente per tenere conto della differenza tra la dimensione dell'ambiente nella shell e il echo
processo. Invece ho ricevuto l'errore:
bash: /bin/echo: Argument list too long
Dopo aver giocato per un po ', ho scoperto che il massimo era un ordine esadecimale di grandezza più piccolo:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
Quando viene rimosso quello meno, l'errore ritorna. Apparentemente il massimo per un singolo argomento è in realtà ARG_MAX/16
e gli -1
account per il byte null posto alla fine della stringa nella matrice di argomenti.
Un altro problema è che quando l'argomento viene ripetuto, la dimensione totale dell'array degli argomenti può essere più vicina ARG_MAX
, ma ancora non del tutto:
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
L'uso "${args[0]:6533}"
qui allunga l'ultimo argomento di 1 byte e genera l' Argument list too long
errore. È improbabile che questa differenza sia spiegata dalla dimensione dell'ambiente dato:
$ cat /proc/$$/environ | wc -c
1045
Domande:
- È un comportamento corretto o c'è un bug da qualche parte?
- In caso contrario, questo comportamento è documentato ovunque? Esiste un altro parametro che definisce il massimo per un singolo argomento?
- Questo comportamento è limitato a Linux (o anche a versioni particolari di questo)?
- Cosa spiega la discrepanza aggiuntiva di ~ 5 KB tra la dimensione massima effettiva dell'array di argomenti più la dimensione approssimativa dell'ambiente e
ARG_MAX
?
Informazioni addizionali:
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
dipende dalla corrente ulimit -s
. Impostalo su illimitato e ottieni un fantastico 4611686018427387903 per ARG_MAX.