Linux komut satırı karakter sınırı


27

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.


1
Soruyu anlamadım. Karakter sınırlamasıyla ilgileniyor musunuz?
krissi

Sorunuzu daha net bir şekilde belirtmeniz gerekir, aksi halde sadece kapanacak.
ThatGraemeGuy

Yanıtlar:


26

Uygulanan kabuk / işletim sistemi sınırı genellikle çok uzundur - genellikle bir veya iki yüz bin karakter.

getconf ARG_MAXsize 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.


2
Benim sistemde, getconf ARG_MAX2097152 verir ama geçebilir max arg süresi henüz 131.071 (ve ben ortamın boyutuna düşeriz gerekmez).
sonraki duyuruya kadar duraklatıldı.

1
Ayrıca , dev argüman listeleriyle uğraşırken arkadaşlarınız xargsbile olduğunu unutmayın find -exec.
coredump

@Dennis: Döndürülen değer getconfbence ç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.
David Spillett

İçinde aynı sonuçları elde etmek ksh, zsh, dash, fishhata mesajı gelen Bash 4'te olduğu gibi ve dondurma 3 fishbilgi ç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 -c306317'dir ve 2507'dir env | wc -cki bu farkı hesaba katmaz. Başka neyin sayıldığını bilmiyorum.
sonraki duyuruya kadar duraklatıldı.


1

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

2
Aslında bu çok uzun bir değişken değeri .
sonraki duyuruya kadar duraklatıldı.

3
Ayrıca, perlbir komut dosyası kullanmak zorunda değilsiniz :/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
sonraki bildirime kadar duraklatıldı.

@DennisWilliamson, ancak printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullçalışır.
jarno

Bunun nedeni printfyerleşik bir kabuktur, yani başka bir sürecin doğması bashiçin yapmak gerekmez exec(). ARG_MAXsadece bağımsız değişken listesi uzunluğuna önemli exec(fonksiyonlar exec(), execl(), execlp(), execvp(), execvpe(), vs.).
Vicente Olivert Riera,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.