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 $LOGFILE
tetapi saya ingin mengerti dari perspektif exec
pernyataan.
exec
baris bisa saja menjadi satu (exec > >(tee "$LOGFILE") 2>&1
).Jawaban:
Dalam shell,
exec
apakah 1) membuka file dan pengalihan 2) aktualexec
(mengganti gambar proses saat ini dengan gambar proses lain).Ini
exec
adalah pengalihan.Pertama, Anda mengarahkan (
exec 1> >(tee $LOGFILE)
)stdout
deskriptor (1) ke proses yang dihasilkan oleh pipa substitusi yang terhubung ketee
proses yang dijalankan bersamaan yang memiliki$LOGFILE
argumen pertama dan kemudian Anda mengarahkanstderr
deskriptor (2) ke tempat yang sama dengan tempat deskriptor1
sekarang menunjuk (tee) pipa).Ingatlah bahwa pewaris skrip dapat diwarisi, Anda baru saja membuat semua masa depan
stdout
danstderr
hasilnya masuk ketee
proses, yang menulisnya ke$LOGFILE
dan 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 diexec 1> >(tee "$LOGFILE")
terjadi setelahtee
telah dimulai, meninggalkantee
dengan 1 pengesahan yang sama yang diwarisi dari shell induk. (Jika sebaliknya,tee
akan dibuat untuk menulis ke input sendiri, yang mungkin membuatnya menemui jalan buntu, tergantung pada pola IO-nya).sumber