Tek bir argümanın maksimum uzunluğunun burada genel argüman dizisinin toplam büyüklüğü ile sınırlı olan ortamın büyüklüğü kadar sorun olmadığı izlenimindeydim ARG_MAX
. Böylece, aşağıdakine benzer bir şeyin başarılı olacağını düşündüm:
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
Kabuktaki - 100
ortamın büyüklüğü ile echo
proses arasındaki farkı hesaba katmak için fazlasıyla yeterli olması . Bunun yerine hatayı aldım:
bash: /bin/echo: Argument list too long
Bir süre etrafta oynadıktan sonra, maksimum değerin tam altıgen büyüklüğünde daha küçük olduğunu buldum:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
Eksi bir çıkarıldığında, hata geri döner. Görünüşte, tek bir argüman için maksimum değer aslında ARG_MAX/16
ve -1
argüman dizisindeki dizgenin sonuna yerleştirilen boş bayt hesapları.
Başka bir sorun, argüman tekrarlandığında argüman dizisinin toplam boyutunun daha yakın olabileceği ARG_MAX
, ancak tam olarak orada olmadığıdır:
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
"${args[0]:6533}"
Burada kullanmak son argümanı 1 baytı daha uzun yapar ve Argument list too long
hatayı verir . Bu farkın, verilen ortamın büyüklüğü tarafından dikkate alınması muhtemel değildir:
$ cat /proc/$$/environ | wc -c
1045
Sorular:
- Bu doğru davranış mı, yoksa bir yerde bir hata mı var?
- Olmazsa, bu davranış herhangi bir yerde belgeleniyor mu? Tek bir argüman için maksimum değeri tanımlayan başka bir parametre var mı?
- Bu davranış Linux ile sınırlı mı (veya bunun belirli sürümleri)?
- Argüman dizisinin asıl maksimum büyüklüğü ile ortamın yaklaşık büyüklüğü arasındaki ek ~ 5KB tutarsızlığı
ARG_MAX
nedir?
İlave bilgi:
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
, akıma bağlı ulimit -s
. Sınırsız olarak ayarlayın ve ARG_MAX için inanılmaz bir 4611686018427387903 edinin.