Bir kabuk betiğinin yaptığı tüm etkinlikleri günlüğe kaydetmenin kolay bir yolu var mı?

17

Bir kabuk komut dosyasından gelen tüm etkinlikleri günlüğe kaydetmek için kolay bir yol var mı?

Bir komut dosyası var. Diğer program çıktılarının yanı sıra echo "talimatları" gibi şeyler çıkarır. Komutları biliyorum:

command | tee -a "$log_file"

ve

command >> logifle.log

Sorduğum şey, kayıt için bir kabuk parametresi veya kullanabileceğim bir ayar komutu veya bunun gibi bir şey olup olmadığıdır. Gerekmiyorsa düzinelerce yönlendirme veya dosyaya tişört eklemek istemiyorum. Yine de std çıkışı almak istiyorum - sadece aynı zamanda oturum açmak istiyorum: wq

    
sordu j0h 30.07.2015 18:17

2 cevap

17

Eğer normalde komut dosyanızı foo.sh ile çalıştırırsanız, bash -x foo.sh ile çalıştırmayı deneyin (bash betiği olduğunu varsayarak). Her şeyin dosyaya yeniden yönlendirilmesini istiyorsanız, bash -x foo.sh > file.log 2>&1 değerini deneyin (notta stderr'i de yönlendirdiğimi unutmayın, bunu istemiyorsanız 2>&1 dosyasını kaldırın). Neler olup bittiğini görmek isterseniz, bash -x foo.sh 2>&1 | tee log.file .

    
verilen cevap roadmr 30.07.2015 18:24
18

Çok kolay ve kullanışlı bir yol var:

Terminal oturumu metni yapmak için script kullanma

  1. script komutunu başlatın

    file argümanı verilirse, örn. script ~/tmp/output , script bu dosyada diyaloğu kaydeder. Dosya adı verilmezse, diyalog typescript dosyasında kaydedilir

  2. Komut dosyanızı veya baştan başlamak istediğiniz şeyi başlatın

  3. Komut dosyanız bittiyse, script değerini Ctrl - D

  4. ile durdurun.
  5. Çıktıyı varsayılan çıktı dosyasında kontrol edin typescript

Komutunuzu script ile bir adımda başlatmak için -c

parametresini kullanın.
-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

Komut dosyanızın içinde script kullanımı mantıklı değil çünkü script kabuğu sorar veya yeni bir kabuk başlatır.

  

SHELL değişkeni varsa, komut dosyası tarafından çatallanan kabuk o kabuk olacaktır. SHELL ayarlanmamışsa, Bourne kabuğu kabul edilir. (Çoğu kabuk bu değişkeni otomatik olarak ayarlar.)

    
verilen cevap A.B. 30.07.2015 18:28

Etiketlerdeki diğer soruları oku