Bunun "argüman çok uzun" hatasını ortaya çıkaracağını buldum:
ls *.*
Ve bu onu yükseltmeyecekti:
for file in *.*
do
echo $file
done
Neden?
Bunun "argüman çok uzun" hatasını ortaya çıkaracağını buldum:
ls *.*
Ve bu onu yükseltmeyecekti:
for file in *.*
do
echo $file
done
Neden?
Yanıtlar:
"Bağımsız değişken çok uzun" hatası, bağımsız değişkenlerin toplam boyutu (artı bazı sistemlerde ortam) çok büyükse sistem çağrısı E2BIGtarafından ortaya çıkar execve. execveÇağrı, özellikle farklı bir yürütülebilir dosya yükleme, dış işlemleri başlatır biridir (farklı telefon var, fork, kodunu, aynı yürütülebilir dosya hala ayrı bir işlem çalıştırmak için). forBu arama dahil değildir bu yüzden ilmek, bir iç kabuk ve güvenilir olduğu bulunmuştur execve. Komut ls *.*, glob genişletildiğinde değil lsçağrıldığında hatayı yükseltir .
execveE2BIGkomuta argümanların toplam boyutu ARG_MAX sınırdan büyük olduğunda hatayla başarısız olur . Bu sınırın değerini komutuyla sisteminizde görebilirsiniz getconf ARG_MAX. (Yeterli belleğiniz varsa bu sınırı aşmanız mümkündür; ilgisiz hata oluşmadığı sürece çalışacak ARG_MAXgarantiler altında tutmak execve.)
execveSınır çekirdek tarafından uygulanır, sınırlar koyar çünkü argümanların bir noktada çekirdek belleği aracılığıyla kopyalanması gerekir ve kullanıcı işlemlerinin rasgele miktarda kabuk belleği istemesine izin verilemez. Kabuğun içinde herhangi bir sınırın olması için hiçbir neden yok, sanal belleğe uyan her şey yolunda.
İlk örnekte / pair sistem çağrısı yoluyla lsyürütüldüğünü , ikincisinde ise tüm çalışmaların dahili olduğunu düşünüyorum .bashforkexecbash
execÇağrı iç çalışma, sınırları vardır bashyerine koymamıştır (veya daha iyisi ile ilgisi olmayan farklı sınırlara sahiptir exec, kullanılabilir bellek belki tutar).
execiçinde /usr/include/linux/limits.hgenellikle, olarak tanımlanır ARG_MAX.
Çünkü lsbu bir argüman ve argüman sayısı sınırlıdır.
forDöngü durumunda , bu sadece bir öğe listesidir. Bunun için herhangi bir sınırlama yoktur (bildiğim kadarıyla).
for i in {00000001..20000000} ;do ((10#$i==1)) && break; done
/bin/bashvs/bin/sh(belki de bir çizgi bağlantısı)?