เป็นไปได้หรือไม่ที่จะเปลี่ยนเส้นทางเอาต์พุตทั้งหมดของเชลล์สคริปต์ Bourne ไปยังที่อื่น แต่ด้วยคำสั่งเชลล์ภายในสคริปต์เอง?
การเปลี่ยนเส้นทางเอาต์พุตของคำสั่งเดียวนั้นง่าย แต่ฉันต้องการอะไรมากกว่านี้:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
ความหมาย: หากสคริปต์รันแบบไม่โต้ตอบ (เช่น cron) ให้บันทึกเอาต์พุตของทุกสิ่งลงในไฟล์ หากเรียกใช้แบบโต้ตอบจากเชลล์ให้เอาต์พุตไปที่ stdout ตามปกติ
ฉันต้องการทำสิ่งนี้สำหรับสคริปต์ที่รันตามปกติโดยยูทิลิตี้ FreeBSD เป็นระยะ ๆ เป็นส่วนหนึ่งของการทำงานประจำวันซึ่งปกติฉันไม่สนใจที่จะเห็นทุกวันทางอีเมลดังนั้นฉันจึงไม่ได้ส่ง อย่างไรก็ตามหากบางสิ่งบางอย่างในสคริปต์นี้ล้มเหลวสิ่งสำคัญสำหรับฉันและฉันต้องการที่จะสามารถจับภาพและส่งอีเมลผลลัพธ์ของส่วนหนึ่งของงานประจำวันนี้
ปรับปรุง: คำตอบของโจชัวเป็นจุดบน แต่ฉันยังต้องการบันทึกและคืนค่า stdout และ stderr รอบสคริปต์ทั้งหมดซึ่งจะทำเช่นนี้:
# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
exec 1>&3 2>&4 3>&- 4>&-