ฉันไม่สามารถใช้งานสายการบินเดียวที่ง่ายมากของ Dennis ดังนั้นนี่เป็นวิธีที่ซับซ้อนกว่านี้มาก ฉันจะลองก่อน
ตามที่กล่าวไว้คุณสามารถใช้ exec เพื่อเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐาน & มาตรฐานสำหรับสคริปต์ทั้งหมด เช่น
exec > $LOGFILE 2>&1
นี้จะส่งออก stderr และ stdout ทั้งหมดไปที่ $ LOGFILE
ตอนนี้เนื่องจากคุณต้องการให้สิ่งนี้แสดงบนคอนโซลรวมถึงไฟล์บันทึกคุณจะต้องใช้ไปป์ที่มีชื่อสำหรับผู้บริหารที่จะเขียนถึงและทีเพื่ออ่านจาก
(เดนนิสหนึ่งซับในทางเทคนิคไม่นี้เป็นอย่างดีแม้จะเห็นได้ชัดในทางที่แตกต่างกัน) mkfifo $PIPEFILE
ท่อตัวเองถูกสร้างขึ้นด้วย จากนั้นทำดังต่อไปนี้
# เริ่มทีการเขียนไปยังล็อกไฟล์ แต่ดึงอินพุตจากไพพ์ที่มีชื่อของเรา
tee $ LOGFILE <$ PIPEFILE &
# ประมวลผล ID กระบวนการของ tee สำหรับคำสั่ง wait
TEEPID = $!
# เปลี่ยนเส้นทางส่วนที่เหลือของ stderr และ stdout ไปยัง pipe ที่มีชื่อของเรา
exec> $ PIPEFILE 2> & 1
echo "สร้างคำสั่งของคุณที่นี่"
echo "มาตรฐานทั้งหมดของพวกเขาจะได้รับ teed"
echo "ข้อผิดพลาดมาตรฐานของพวกเขาจะ"> & 2
# ปิดคำอธิบายไฟล์ stderr และ stdout
exec 1> & - 2> & -
# รอให้ทีจบตั้งแต่ตอนนี้ปลายอีกด้านของท่อปิดแล้ว
รอ $ TEEPID
หากคุณต้องการที่จะละเอียดคุณสามารถสร้างและทำลายไฟล์ไปป์ที่มีชื่อที่จุดเริ่มต้นและจุดสิ้นสุดของสคริปต์ของคุณ
สำหรับเร็กคอร์ดนี้ฉันได้รวบรวมสิ่งเหล่านี้ส่วนใหญ่จากโพสต์บล็อกที่ให้ข้อมูลอย่างมากของคนที่แต่งตัวประหลาด: ( เวอร์ชันที่เก็บถาวร )