Bir değişkeni komut satırındaki bir komut dosyasına geçiriyorum. Bir komutun karakter sınırı nedir? Örneğin:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Teşekkürler.
Bir değişkeni komut satırındaki bir komut dosyasına geçiriyorum. Bir komutun karakter sınırı nedir? Örneğin:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Teşekkürler.
Yanıtlar:
Uygulanan kabuk / işletim sistemi sınırı genellikle çok uzundur - genellikle bir veya iki yüz bin karakter.
getconf ARG_MAX
size bir komut için maksimum giriş sınırını verir. Debian sisteminde şu anda açık olan bir terminalim var ve bu değer 128 * 1024 olan 131072'ye döner. Sınır, ortam değişkenleriniz tarafından hafızam bana doğru hizmet ediyormuş gibi azalır, bunlar kabuk tarafından aynı yapıya geçirilir, ancak çoğu durumda yalnızca birkaç yüz karakter çıkarır. Bu değer çalıştırmasının yaklaşık bir değerini bulmak için env | wc -c
- bu, şu anda bu makinede bu oturum açmada 325 karakter önerir.
Komut dosyalarının bu tam uzunluğa izin vermesi muhtemeldir, ancak diğer hizmet kuruluşlarının kendi sınırlarını kasıtlı olarak veya tasarım sorunları yoluyla getirmeleri pek olası değildir. Uzun bir komut satırındaki bireysel bir argümanın ne kadar süreceği ve / veya bir dosyaya giden yolun ne kadar olabileceği konusunda yapay sınırlamalar da olabilir.
getconf ARG_MAX
2097152 verir ama geçebilir max arg süresi henüz 131.071 (ve ben ortamın boyutuna düşeriz gerekmez).
xargs
bile olduğunu unutmayın find -exec
.
getconf
bence çekirdek seviyesidir. Belki de bash tasarımı / yapılandırmasıyla daha düşük bir sınır belirliyor? Ayrıca, bunun hakkındaki bilgim bir süre önce ortaya çıktı, bu yüzden yeni deneysel kabukları haricinde çok fazla hareket görmeyi umduğum bir alan olmasa da, işler kısa süre önce değişmiş olabilir.
ksh
, zsh
, dash
, fish
hata mesajı gelen Bash 4'te olduğu gibi ve dondurma 3 fish
bilgi çekebilir: "balık: bağımsız değişken ve çevre listelerinin toplam boyutu S (130KB) 2.0MB işletim sistemi sınırını aşan ." Bununla birlikte, set | wc -c
306317'dir ve 2507'dir env | wc -c
ki bu farkı hesaba katmaz. Başka neyin sayıldığını bilmiyorum.
ARG_MAX aslında komut satırının ve ortamın toplam boyutunu sınırlar, ancak ek bir sınırlama ile karşı karşıya kalırsınız: bir argüman MAX_ARG_STRLEN'den daha uzun olmamalıdır (maalesef 131072 olduğu kodlanmıştır).
En uzun değişken uzunluğu nedir demek istiyorsun? Çok uzun bir değişken ismi oluşturmak için perl'in "x" işaretini kullanabilirsiniz.
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
Sistemimde 131071 çalışıyor:
ve değişken 131072’de basılmıştır:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
bir komut dosyası kullanmak zorunda değilsiniz :/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
çalışır.
printf
yerleşik bir kabuktur, yani başka bir sürecin doğması bash
için yapmak gerekmez exec()
. ARG_MAX
sadece bağımsız değişken listesi uzunluğuna önemli exec
(fonksiyonlar exec()
, execl()
, execlp()
, execvp()
, execvpe()
, vs.).