Dennis'in çok basit bir astarını çalıştıramadım, işte çok daha kıvrımlı bir yöntem. İlkini denerdim.
Belirtildiği gibi, tüm komut dosyası için standart hatayı ve standart çıkışı yeniden yönlendirmek için exec kullanabilirsiniz.
exec > $LOGFILE 2>&1
Bu şekilde: Bu, tüm stderr ve stdout'u $ LOGFILE dizinine çıkarır.
Şimdi, bunun bir günlük dosyasının yanı sıra konsola görüntülenmesini istediğiniz için, exec'nin yazmak ve okumak için tee için adlandırılmış bir kanal kullanmanız gerekecektir.
(Dennis'in tek astarı teknik olarak bunu da farklı bir şekilde olsa da yapıyor) Borunun kendisi ile yaratıldı mkfifo $PIPEFILE. Ardından aşağıdakileri yapın.
# Bir günlük dosyasına tee yazmaya başlayın, ancak girdisini adlandırılmış kanalımızdan çekin.
tee $ LOGFILE <$ PIPEFILE ve
# wait komutunun tee komutunun işlem kimliği.
TEEPID = $!
# stderr ve stdout'un geri kalanını adlandırılmış kanalımıza yönlendirin.
exec> $ PIPEFILE 2> & 1
echo "Komutlarınızı buraya yazın"
echo "Bütün standartları teed alacak."
echo "Standart hataları da öyle"> & 2
# stderr ve stdout dosya tanımlayıcılarını kapatın.
exec 1> & - 2> & -
# Borunun diğer ucu kapandığı için tişörtün bitmesini bekleyin.
$ TEEPID bekleyin
Kapsamlı olmak istiyorsanız, komut dosyanızın başında ve sonunda adlandırılmış kanal dosyasını oluşturabilir ve yok edebilirsiniz.
Kayıt için, bunun çoğunu rastgele bir erkeğin çok bilgilendirici blog gönderisinden topladım : ( Arşivlenmiş sürüm )