2011-02-26 2 views
9

echo veya printf numaralı tüm çağrıların sırasıyla stdout/stderr üzerinde fflush() numaralı bir sonraki çağrıyla izlenmesinin mümkün olup olmadığını söylemek mümkün mü acaba?Bir kabuk komut dosyasını fflush'a zorla

Hızlı ve kirli bir çözüm, bunu yaptığım kendi printf uygulamamı yazmak ve bunu yerleşik olarak kullanmak yerine kullanmak olurdu, ancak benim ihtiyaç duymayacağım bir şey oldu.

Aynı anda çalışan birkaç derleme komut dosyası yazıyorum, hata ayıklama ihtiyaçları için ben gerçekten sırayla yazdıkları iletileri görmeniz gerekiyor.

+0

satır bazında bir çizgi ama artık değil. Yeni satırlarda yıkamaya gerek yok mu? –

+0

@Robert - Evet, zamanlama hatalarını bir suçlu olarak ortadan kaldırmak zorundayım, bu yüzden her yazının stderr/stdout öğesinin akışının temizlenmesini sağladığından emin olmalıyım. –

+0

Pipetle uğraşmak: “Stty” yi kullanarak bir şey ayarlamak yardımcı olabilir. Ya da "unbuffer" adlı "bekliyor" komut dosyasını kullanarak. Ya da Bash'in 'PS4'ünü' $ (tarih "+% s.% N") 'yi (orada bir miktar yük var olmasına rağmen) ve' set -x' komutunu kullanarak ve çıktıyı sıralamak için ayarlayarak. Belki de 'trap' foo 'DEBUG kullanarak bir şey. [Bu] (http://www.pixelbeat.org/programming/stdio_buffering/) yararlı bilgiler sağlıyor mu? Ya da bir şey [burada] (http://stackoverflow.com/questions/1507674/how-to-add-timestamp-to-stderr-redirection)? –

cevap

10

Eğer comandlar stdio kullanıyorsa ve bir terminale bağlıysa, bunlar satır başına temizlenir. olabilir komut stdbuf -o0 printf .. koymak yerine printf ... try veya stdbuf -oL printf ...

+0

Sadece stdbuf'u bağımsız olarak uygulamayı düşünüyordum Ben, daha eski bir coreutil sürümüne sahip sistemler ile bir taşınabilirlik sorunu ile uğraşıyorum (veya daha basit bir şekilde sadece verilen stream/fd'yi temizleyen xxprintf) –

+0

Bunu yapmanın tek yolu stdbuff ile uygulanıyor gibi görünüyor eğer mevcut değilse kendiniz. –

0

Belki "stty ham": dr; Aksi takdirde bir boru hattı http://www.pixelbeat.org/programming/stdio_buffering/

tl içinde komutlar üzerinde stdbuf gibi bir şey kullanmak gerekir satır sonu kullanımı için diğer bazı hilelerle yardım edin. AFAIK "raw" modu, en azından seri port için kullanıldığında ("stty raw </dev/ttyS0") satır tabanlı arabelleği kapatır.

1

Dosya okunacak şekilde zorlanırsa, arabelleğin temizlenmesine neden olur. Bunlar benim için çalışıyor.

Ya yararsız bir değişkene veri okumak:

x=$(<$logfile) 

Veya UUOC yapın: Değil, ben onlar üzerinde floş olacaktır böylece BASH tamamen hat dayanır düşünüyorum Bildiğim kadarıyla

cat $logfile > /dev/null