Nach ARG_MAX, maximale Länge der Argumente für ein neues Verfahren , wie es scheint , ARG_MAX
ist falsch (oder zumindest zweideutig) auf meinem Mac Mini 3,1 Ubuntu 12.04 definiert:
$ getconf ARG_MAX # arguments
2097152
$ locate limits.h | xargs grep -ho 'ARG_MAX[ \t]\+[0-9]\+' | uniq | cut -d ' ' -f 8
131072
Die tatsächliche Grenze scheint irgendwo zwischen diesen zu liegen:
$ cd "$(mktemp -d)"
$ touch $(seq 1 131072) && find . -mindepth 1 -printf x | wc -c && rm *
131072
$ touch $(seq 1 131073) && find . -mindepth 1 -printf x | wc -c && rm *
131073
$ touch $(seq 1 $(getconf ARG_MAX)) && find . -mindepth 1 -printf x | wc -c && rm *
bash: /usr/bin/touch: Argument list too long
Ich habe eine kleine Suche durchgeführt:
cd "$(mktemp -d)"
min=131072
max=2097152
while true
do
search=$((min + (max - min) / 2))
if touch $(seq 1 $search) 2>/dev/null
then
min=$search
else
max=$search
fi
[[ $((max - min)) -le 1 ]] && echo "ARG_MAX = $min" && break
done
Letztendlich führte dies zu ARG_MAX = 314290
einer Beziehung, die mit keinem der ARG_MAX
zuvor gefundenen Werte in Beziehung zu stehen scheint . Ist das normal? Gibt es einen einfacheren Weg, um das tatsächliche zu finden ARG_MAX
?
Habe ich die Definition von ARG_MAX falsch verstanden? Es scheint tatsächlich die Bytelänge (oder möglicherweise die Zeichenlänge) der Argumente mit oder ohne (?) Die Trennzeichen zu sein. Wenn es wirklich die Bytelänge ist, gibt es auch andere Einschränkungen ?