Stderr ve stdout'u farklı dosyalara yönlendirmek ve ayrıca terminalde görüntülemek nasıl?


30

Terminalde bir komutun çıktısını sanki yönlendirme yokmuş gibi görmek istiyorum. Ayrıca, stderr err.log'a yönlendirilmeli ve stdout stdout.log'a yönlendirilmelidir.

Stdouterr.log: Terminalde gösterilenlerin tam bir kopyasını, yani ayrı bir dosyada olduğu gibi ve ne zaman yazıldığını gösteren hataların olması da iyi olurdu: stdouterr.log.


@Nuno Hayır, hayır. OP, stdout ve stderr için farklı dosyalara sahip olmak istiyor.
dogbane

@dogbane Evet, haklısın. Bunun için üzgünüm.
Nuno C. Inácio

Bu soruyu hala çok tanıdık buluyorum. Beni yukarı bakalım ... İşte çok benzer bir tanesidir unix.stackexchange.com/q/4195/250 ve burada ilgili biridir unix.stackexchange.com/q/1416/250
phunehehe

Yanıtlar:


37

teeKomutu aşağıdaki gibi kullanın :

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 stderr ve stdout'u nasıl değiştirirsiniz, çünkü tee yalnızca stdout'u kabul edebilir.

Kullanarak daha gelişmiş yönlendirmeler için Unix tee komutuna göz atın tee.


güzel bir çözüm. Cmd çıkış kodunu almanın bir yolu var mı?
turbanoff

2
Değiştir @turbanoff cmdile (cmd ; echo >exit_code.txt $?).
Parthian,

Bunun komut satırına gönderilen şeylerin sırasını daha iyi koruyacağına inanıyorum:((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

Sanırım stdout ve stderr'i iki farklı dosyaya kaydetmek harika bir fikir. Günlükleri senkronize etmez mi? Bu yüzden aşağıdakileri denedim:

  • "stdout.log" için stdout (dogbane'nin önerdiği gibi)
  • stderror "stderr.log" a (dogbane'nin önerdiği gibi)
  • tüm çıktılar "all.log" a ve
  • Çıktıyı ekranda hala görebiliyor (yine de ayrı bir terminalde!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

başka bir terminalde

tail -f --sleep-interval=2 all.log

Stderr'i doğrudan ikinci tty'ye yönlendirmek mümkün değil mi? Daha sonra hiçbir günlük dosyası gerekli değildir.
Steven Lu,

@StevenLu evet, adını biliyorsanız ve yapılabilecek ikinci tty'ye yazma izniniz varsa.
Jasen

1
kolay &| tee all.logyerine &> all.log
emrin

@ Jasen: 2 kez görüyorum &|. Anlıyorum &>, |&çok ama ne gelmez &|bu bağlamda demek? Uygun bir sözdizimi referansı bulamadım, ağda değil, bash kılavuz sayfasına "bash (1)"
bile bakmadan bile

1
@ Hiçbir şey yapmadan söyleyebildiğim kadarıyla, demek istediğim|&
Jasen

3

@dogbane, Teşekkürler.
Her iki akışı da, yönlendirme olmadan yazdırılacağı sırayla yaklaşık olarak kaydeden başka bir yol buldum.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Ancak bu sadece işlem ikamesini destekleyen mermilerle çalışır.


-2

bunu dene :

command 2>&1 | tee bothLog

4
Merhaba vasile, bu soruyu cevaplamıyor: balki'nin stdout ve stderr için ayrı dosyalara ihtiyacı var, çözümünüz aynı akışı aynı anda karıştırıyor.
Mat

Neden insanlar stdout ve stderr'i bir araya getiriyorlar? Yoksa başkalarına da öyle yapmalarını mı söyle?
nurettin,
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.