Bir komut dosyasının çıktısının kopyasını bir dosyaya gönderme


10

Diyelim ki bir Zsh betiğim var ve çıktıyı yazdırmasına izin vermek istiyorum STDOUT, aynı zamanda çıktısını diskteki bir dosyaya kopyalayın (dökümü).

Ayrıca, komut dosyası aşağıdaki seçenekle başlar

set -o xtrace

bu da onu ayrıntılı olmaya ve çalıştırdığı komutları yazdırmaya zorlar. Bu çıktıyı diskteki bir dosyada da yakalamak istiyorum.

Benim anlayışım eğer yaparsam

./my_script.sh > log.txt

Sadece gönderecek STDOUTkadar log.txt, ama ne de terminali de çıkışını görmek mümkün isterseniz?

Ben Zsh hakkında teeve MULTIOSseçenek hakkında okudum , ama nasıl kullanılacağından emin değilim.

Ben yaparken:

./my_script | tee log.txt

Terminalde çıktı görebiliyorum, ama dosya log.txther şeyi yakalamak için aslında değil (aslında zar zor bir şey yakalar).


./my_script.sh > log.txt 2>&1
mikeserv

scriptKomutu arýyor gibisin . Veya belkimyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Yanıtlar:


12

Senaryo stdoutve için çıktı üretiyor olabilir ve stderrbu akışlardan sadece biri günlük dosyasına çıktı almak olabilir.

./my_script.sh | tee log.txtgerçekten her şeyi terminale gönderir, ancak yalnızca stdoutlog dosyasına dökülür.

./my_script.sh > log.txt 2>&1 tersini yapacak, her şeyi günlük dosyasına dökecek, ancak ekranda hiçbir şey göstermeyecek.

İşin püf noktası ikisini aşağıdakilerle birleştirmektir tee:

./myscript.sh 2>&1 | tee log.txt

Bu yönlendirmeleri stderr( 2da) stdout( 1), daha sonra boru stdouthalinde tee, ki bu uç kopya ve günlük dosyasına.

zshMultios eşdeğer olacaktır:

./myscript.sh >&1 > log.txt 2>&1

Yani, stdout'u hem orijinal stdout'a hem de log.txt'ye (dahili olarak bir boru yoluyla benzer şekilde çalışan bir şeye tee) yönlendirin ve sonra stderr'i buna da (boruya dahili teebenzeri sürece) yönlendirin.


Teşekkürler - Son satırınızla ilgili olarak neden olmasın ./myscript.sh >&1 2>&1 > log.txt? (yani son iki yönlendirmenin sırasını değiştirme). Aralarında fark olur mu?
Amelio Vazquez-Reina

Varyantınız stdoutsadece çıktı vermez log.txt. Yanıttaki son satır (kendim değil de @ StéphaneChazelas tarafından eklendi) her ikisine de çıktı.
savanto

0

nohup, konsolun ölmesine veya kapanmasına rağmen bir işin devam etmesine izin verir, uzun yedeklemeler vb. için yararlıdır, ancak burada otomatik günlüğünü kullanıyoruz.

nohup myscript.sh & ; tail -f nohup.out
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.