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


18

Bir kabuk betiğinden bir dosyaya yapılan tüm etkinlikleri günlüğe kaydetmenin kolay bir yolu var mı?

Bir senaryom var. Yankı "talimatlar" ve diğer program çıktıları gibi çıktılar verir. Komutları biliyorum:

command | tee -a "$log_file"

ve

command >> logifle.log

Sorduğum şey, günlüğe kaydetme için bir kabuk parametresi veya kullanabileceğim bir set komutu veya bunun gibi bir şey olup olmadığı. Gerekmiyorsa, dosyalara düzinelerce yönlendirme veya tee eklemek istemiyorum. Yine de std çıktı almak istiyorum - sadece ben de günlüğe istiyorum .:wq


5
LOL
,: vim'de

1
aklımı boğuyor, çoğu insan bunu yerine şunu yapıyor gibi görünüyor: x
Özür dileyin ve Monica'yı yeniden

Yanıtlar:


18

betiğinizi normalde ile çalıştırıyorsanız, foo.sh(bash betiği olduğunu varsayarak) ile çalıştırmayı deneyin bash -x foo.sh. Her şeyin dosyaya yönlendirilmesini istiyorsanız, deneyin bash -x foo.sh > file.log 2>&1(stderr'ı da yönlendiriyorum, 2>&1bunu istemiyorsanız kaldırın ). Ayrıca neler olup bittiğini görmek istiyorsan bash -x foo.sh 2>&1 | tee log.file.


20

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

scriptTerminal oturumu yazımı yapmak için kullanma

  1. Komutu başlat script

    Argümanı ise fileverilir, örneğin script ~/tmp/output, scriptbu dosyada diyaloğu kaydeder. Dosya adı verilmezse, diyalog dosyaya kaydedilirtypescript

  2. Senaryonuzu veya ne başlatmak istediğinizi başlatın

  3. Senaryonuz bitmiş ise, durdurma scriptyoluyla Ctrl-D

  4. Varsayılan çıktı dosyasındaki çıktıyı kontrol edin typescript


Komutunuzu bir adımda başlatmak için scriptşu parametreyi kullanın:-c

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

scriptKomut dosyanızın içinde kullanılması mantıklı değildir, çünkü scriptkabuğu çatallar veya yeni bir kabuk başlatır.

SHELL değişkeni varsa, komut dosyası tarafından çatallanan kabuk o kabuk olur. SHELL ayarlanmadıysa, Bourne kabuğu varsayılır. (Çoğu mermi bu değişkeni otomatik olarak ayarlar).


4
@Fabby Cevabımı seviyorum, ama küçük gri bir şey görmüyorum;)
AB

Ben kullanıyorum script logfilename, bu yüzden onu seçiyorum.
waltinator

programımdan "script" i arayabilir miyim?
j0h

1
Bu hiç mantıklı değil, gelişmiş cevabımı görün.
AB

1
+1. Bu cevap için teşekkürler :-) scriptbir fifo üzerinden izleme de yararlıdır. Kimden man script: " -f, --flushHer yazma işleminden sonra çıktıyı boşaltın. Bu telekopoperasyon için güzel: bir kişi yapar mkfifo foo; script -f foove diğeri kullanılarak yapılanları gerçek zamanlı olarak denetleyebilir cat foo". Ayrıca bir programın girdi beklediğini izlemek ya da örneğin fifo'nun zaman damgasını izlemek suretiyle ne zaman yapılacağını izlemek için de kullanılabilir.
sudodus
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.