exec ve log dosyasına aktar: bu bash komutlarını açıklar


15

Bunu benim bash script dosyamın üstünde gördüm:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

Bu ne işe yarıyor? Burada iki yürütme işlemi ne yapıyor? Bunu böyle koruduğumu fark ettim, senaryonun yürütülmesinin tüm çıktıları borsada $LOGFILEama execaçıklamaların perspektifinden anlamak istedim .



1
Sen üstündeki bu gördüğümüz sizin bash komut dosyası? ;)
Sebb

1
İki execçizgi sadece bir ( exec > >(tee "$LOGFILE") 2>&1) olabilir.
Jonathan Leffler

Yanıtlar:


18

Kabuklarda, exec1) dosya açıklıkları ve yönlendirmeleri yapar 2) gerçek execing (geçerli işlem görüntüsünü başka bir işlem görüntüsüyle değiştirir).

Bunlar execyeniden yönlendirmelerdir.

Önce tanımlayıcıyı (1) , ilk argümanı olan eşzamanlı olarak çalışan bir işleme bağlı bir işlem ikamesi tarafından üretilen boruya yönlendirirsiniz ( exec 1> >(tee $LOGFILE)) ve daha sonra tanımlayıcıyı (2) tanımlayıcının şimdi işaret ettiği yere (tee) yönlendirirsiniz. boru).stdouttee$LOGFILEstderr1

Dosya tanımlayıcıların kalıtsal olduğunu aklınızda tutarak, tüm geleceği stdoutve stderrçıktıyı tee, $LOGFILEdosya yazarı 1'in (muhtemelen terminaliniz) işaret ettiği yere ve nereye yazdığı sürece gittiğinizi unutmayın.


Not: Orijinal Stdout'a tee süreç çıkışları (= orijinal Filedescriptor 1) öğrenebilirsiniz olarak, çünkü gelen / arama bash (1) için Basit Komutanlığı Genişleme ve Süreç Değişiklik , süreç ikamesi ( >() <()) (diğer açılımları ile birlikte) gerçekleşmeden önce yönlendirmeler yürütülür, yani içeri yönlendirme başladıktan sonraexec 1> >(tee "$LOGFILE") gerçekleşir , üst kabuktan devralındığı aynı dosya tanımlayıcı 1 ile bırakılır. (Eğer başka bir yol olsaydı, IO modeline bağlı olarak, kilitlenmeyi engelleyebilecek kendi girdisine yazmak için yapılmıştı). teeteetee

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.