Aynı anda birçok komutu yeniden yönlendirecek bir çözüme gelince:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Orijinal çözümünüz neden çalışmıyor: exec 2> & 1 standart hata çıktısını kabuğunuzun standart çıktısına yönlendirecek, komut dosyanızı konsoldan çalıştırırsanız, konsolunuz olacaktır. komutlardaki boru yönlendirme sadece komutun standart çıktısını yönlendirecektir.
Bakış açısına göre somecommand, standart çıktısı bağlı bir boruya teegirer ve standart hata, kabuğun standart çıktısına yönlendirdiğiniz standart kabuk ile aynı dosya / sözde dosyaya gider. Konsolunuzu programdan çalıştırırsanız
Bunu açıklamanın tek yolu gerçekte ne olduğunu görmektir:
Terminalden çalıştırırsanız, kabuğunuzun orijinal ortamı şöyle görünebilir:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Standart hatayı standart çıktıya ( exec 2>&1) yönlendirdikten sonra , temelde hiçbir şeyi değiştiremezsiniz. Ancak senaryonun standart çıktısını bir dosyaya yönlendirirseniz, bunun gibi bir ortam elde edersiniz:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Ardından, kabuk standart hatasını standart çıktıya yönlendirmek şu şekilde sonuçlanır:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
Bir komutu çalıştırmak bu ortamı devralacak. Bir komutu çalıştırıp onu tişörte geçirirseniz, komutun ortamı şöyle olacaktır:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Bu yüzden komutunuzun standart hatası, kabuğun standart hatası olarak kullandığı işe devam ediyor.
Komutun ortamını bakarak /proc/[pid]/fdşunları yapabilirsiniz: ls -lsembolik bağlantının içeriğini de listelemek için kullanın. Buradaki 0dosya standart girdi, 1standart çıktı ve 2standart hatadır. Komut daha fazla dosya açarsa (ve çoğu program yaparsa), onları göreceksiniz. Bir program aynı zamanda standart giriş / çıkış ve yeniden kullanımını yönlendirmek veya kapatma seçebilir 0, 1ve 2.
|&kısayol olarak çalışır2>&1 |, en azından biraz daha rahattır.