exec และทีออฟล็อกไฟล์: อธิบายคำสั่ง bash เหล่านี้


15

ฉันเห็นสิ่งนี้ที่ด้านบนของไฟล์สคริปต์ทุบตี:

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

มันทำอะไร? กระบวนการ exec สองกระบวนการทำที่นี่ ฉันรู้ว่าการทำให้เป็นแบบนี้ผลลัพธ์ทั้งหมดของการดำเนินการของสคริปต์จะถูกไพพ์ไป$LOGFILEแต่ฉันต้องการที่จะเข้าใจจากมุมมองของexecข้อความ


สิ่งนี้สามารถทำให้ชัดเจน: linuxjournal.com/content/bash-redirections-using-exec
coffeMug

1
คุณเห็นสิ่งนี้ที่ด้านบนของไฟล์สคริปต์ทุบตีของคุณหรือไม่ ;)
Sebb

1
ทั้งสองexecสายสมบูรณ์ดีอาจเป็นเพียงแค่หนึ่ง ( exec > >(tee "$LOGFILE") 2>&1)
Jonathan Leffler

คำตอบ:


18

ใน shells execทำ 1) เปิดไฟล์และเปลี่ยนเส้นทาง 2) execing จริง(แทนที่อิมเมจกระบวนการปัจจุบันด้วยอิมเมจกระบวนการอื่น)

สิ่งเหล่านี้execเป็นการเปลี่ยนเส้นทาง

ก่อนอื่นคุณเปลี่ยนเส้นทาง ( exec 1> >(tee $LOGFILE)) stdoutdescriptor (1) ไปยังไพพ์ที่สร้างการทดแทนกระบวนการเชื่อมต่อกับteeกระบวนการที่รันพร้อมกันซึ่ง$LOGFILEเป็นอาร์กิวเมนต์แรกแล้วคุณเปลี่ยนเส้นทางstderrdescriptor (2) ไปยังตำแหน่งเดียวกับที่ descriptor 1ชี้ไปที่ (ที) ท่อ).

โปรดทราบว่าผู้ที่ได้รับมรดกได้รับมรดกคุณได้สร้างอนาคตทั้งหมดstdoutและstderrส่งออกไปยังteeกระบวนการซึ่งจะเขียนลงไป$LOGFILEในทุกที่ที่ผู้ยื่น 1 ชี้ไปที่เดิม (อาจเป็นเทอร์มินัลของคุณ)


หมายเหตุ: กระบวนการ tee ส่งออกไปยัง stdout ดั้งเดิม (= ไฟล์ต้นฉบับที่ 1) เนื่องจากในขณะที่คุณสามารถเรียนรู้จาก / ค้นหาbash (1)สำหรับการขยายคำสั่งอย่างง่ายและการทดแทนกระบวนการการทดแทนกระบวนการ ( >() <()) เกิดขึ้น (พร้อมกับการขยายอื่น ๆ ) ก่อน การเปลี่ยนเส้นทางได้รับการดำเนินการซึ่งหมายความว่าการเปลี่ยนเส้นทางที่exec 1> >(tee "$LOGFILE")เกิดขึ้นหลังจากที่ teeได้เริ่มต้นออกจากที่teeมี filescriptor 1 เดียวกันที่มันได้รับมรดกจากเปลือกแม่ (หากเป็นวิธีอื่น ๆteeจะถูกเขียนลงในอินพุตของตนเองซึ่งอาจทำให้เกิดการหยุดชะงักขึ้นอยู่กับรูปแบบ IO ของมัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.