bash: echo: yazma hatası: Kesintili sistem çağrısı


9

Tüm 8 basamaklı sayılarla sıralanmış bir liste oluşturmak istiyorum - 00000000'den 99999999'a. Kabuğa yazdım:

f() {
 while IFS="" read -r line; do
   for i in {0..9}; do 
       echo "$line$i";
   done;
 done
}

echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l

cevap

bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
99998890

Neden bu üç hatayı aldım ve sonuç.txt hatalı biçimlendirildi?

kullanırım

GNU bash, sürüm 4.4.12 (1) -çalışma (x86_64-pc-linux-gnu)

Debian GNU / Linux 9.6 (genişletme)

Linux çekirdeği: 4.19.0 # 2 SMP Per 1 Kas 15:31:34 EET 2018 x86_64 GNU / Linux


2
Yardım edemem ama bunu yapmanın böyle hissetmek bundan daha etkili olmaz seq -w 0 99999999.
Kusalananda

1
O zaman soru eksik / yanlış / kötü yazılmış veya başka bir şey. Çünkü komut dosyası (ile tamamlandığında }) düzgün çalışıyor. @ GAD3R
Isaac

1
Not: Bu hataları neredeyse istek üzerine tetikleyebilirim. Genellikle konsolepenceremi yeniden boyutlandırdığımda görünürler . Böyle bir yeniden boyutlandırma benim durumumda neredeyse yeterli, ancak gerekli değil.
Kamil Maciorowski

Ben kaldırabilir | tee result.txtve hala hatayı alabilirsiniz.
ctrl-alt-delor

Başka bir not: yerleşik /bin/echoyerine harici çalıştırılabilir ( benim durumumda) echoişlevi bu konuya bağışıklık (veya en azından daha az eğilimli) yapar.
Kamil Maciorowski

Yanıtlar:


6

write error: Interrupted system callKomut dosyası yürütülürken konsol penceresi boyutu değiştirildiğinde belirli bir hata oluşur.

Yapmak:

 trap '' SIGWINCH

bundan kaçınacaktır.

Bir

 seq 99999999 >result.txt; wc -l <result.txt

Hem daha hızlı olacak hem de SIGWINCHsorunu önleyecek .


5
Peki ne oluyor ?, bunu neden daha önce görmedim ?, Yazma hatası neden yapılacak doğru şey?
ctrl-alt-delor

4

Bu aslında bir hata olduğunu [1] de bashve sadece üzerinde olmaz SIGWINCH, aynı zamanda bir tuzak ayarlanmış olduğu herhangi bir sinyal üzerine,:

{ pid=$BASHPID; trap : USR1; (sleep 1; kill -USR1 $pid) &
         printf %0100000d 1; } | sleep 3600
bash: printf: write error: Interrupted system call

Çünkü olur bash) ya a başarısız ile sinyal işleyicileri set SA_RESTARTharicinde ( SIGCHLDişleyici) veya b) idare EINTRçağrılırken write()içinde printfve echoyerleşikleri.

EINTR("Kesintili sistem çağrısı") bir hata durumunu belirtmenin bir yolu değil, programlayıcının engelleme okumalarını / yazmalarını / vb. Asla kullanıcıya sızdırılmamalıdır.

Bu hata çok sık görünmüyor çünkü doğru koşulları yerine getirmek oldukça başarılı: write()bir yerleşik tarafından yapılmalıdır (harici bir komutla değil), boru tamponunu (diğer taraftaki okuyucu) doldurmalıdır. uç çok daha yavaş olmalı ya da borudan hiç okumuyor olmalı ama hala canlı ) ve komut dosyası tuzaklar kullanmalı veya terminal penceresi yeniden boyutlandırılmalıdır.

Ve çeşitli uygulama yapaylıkları nedeniyle, bu sadece s veya s'yi write()değil (örneğin, adlandırılmış bir borunun / fifo'nun engellenmesi gibi) kesintiye uğramış olanları etkiler .read()open()open()

[1] bunun bir şekli bir süre önce bildirilmişti .

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.