exec dan tee ke file log: jelaskan perintah bash ini


15

Saya melihat ini di bagian atas file skrip bash saya:

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

Apa fungsinya? Apa yang dua proses eksekutif lakukan di sini? Saya menyadari bahwa menjaganya seperti ini, semua hasil dari eksekusi skrip disalurkan ke $LOGFILEtetapi saya ingin mengerti dari perspektif execpernyataan.



1
Anda melihat ini di bagian atas file skrip bash Anda ? ;)
Sebb

1
Dua execbaris bisa saja menjadi satu ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

Jawaban:


18

Dalam shell, execapakah 1) membuka file dan pengalihan 2) aktual exec(mengganti gambar proses saat ini dengan gambar proses lain).

Ini execadalah pengalihan.

Pertama, Anda mengarahkan ( exec 1> >(tee $LOGFILE)) stdoutdeskriptor (1) ke proses yang dihasilkan oleh pipa substitusi yang terhubung ke teeproses yang dijalankan bersamaan yang memiliki $LOGFILEargumen pertama dan kemudian Anda mengarahkan stderrdeskriptor (2) ke tempat yang sama dengan tempat deskriptor 1sekarang menunjuk (tee) pipa).

Ingatlah bahwa pewaris skrip dapat diwarisi, Anda baru saja membuat semua masa depan stdoutdan stderrhasilnya masuk ke teeproses, yang menulisnya ke $LOGFILEdan ke mana pun skrip yang diajukan awalnya (mungkin terminal Anda).


Catatan: Proses tee menghasilkan keluaran stdout asli (= arsip asli 1) karena, seperti yang Anda dapat pelajari dari / mencari bash (1) untuk Pergantian Ekspansi Perintah Sederhana dan Pergantian Proses , subtitusi proses ( >() <()) terjadi (bersama dengan ekspansi lainnya) sebelum pengalihan dijalankan, yang berarti bahwa pengalihan di exec 1> >(tee "$LOGFILE")terjadi setelah tee telah dimulai, meninggalkan teedengan 1 pengesahan yang sama yang diwarisi dari shell induk. (Jika sebaliknya, teeakan dibuat untuk menulis ke input sendiri, yang mungkin membuatnya menemui jalan buntu, tergantung pada pola IO-nya).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.