کاربرد هوشمندانه تغییر مسیر ورودی-خروجی، تجزیه و بهم دوختن تکههای خروجی فرمان را میسر میسازد (مثال 15-7 را ببینید). این کار تولید فایلهای گزارش و ثبت رخداد را ممکن مینماید.
مثال 20-12. وقایعنگاری رویدادها
#!/bin/bash # # #با مجوز در راهنمای ABS استفاده گردیده. #واقعهنگاری رویداد در یک فایل. #باید به عنوان root اجرا گردد (برای دسترسی نوشتن در /var/log) ROOT_UID=0 #فقط کاربران با $UID=0 دارای مزایای root هستند. E_NOTROOT=67 #خطای خروج root نبودن. if [ "$UID" -ne "$ROOT_UID" ] then echo "Must be root to run this script." exit $E_NOTROOT fi FD_DEBUG1=3 FD_DEBUG2=4 FD_DEBUG3=5 #==برای فعال کردن اسکریپت،یکی از دو سطر زیر را از حالت توضیح خارج کنید.== #LOG_EVENTS=1 #LOG_VARS=1 log() #زمان و تاریخ را در فایل لاگ مینویسد. { echo "$(date) $*" >&7 #این سطر تاریج را به انتهای فایل پیوست میکند. # #جایگزینی فرمان #پایینتر را ببینید. } case $LOG_LEVEL in 1) exec 3>&2 4> /dev/null 5> /dev/null;; 2) exec 3>&2 4>&2 5> /dev/null;; 3) exec 3>&2 4>&2 5>&2;; *) exec 3> /dev/null 4> /dev/null 5> /dev/null;; esac FD_LOGVARS=6 if [[ $LOG_VARS ]] then exec 6>> /var/log/vars.log else exec 6> /dev/null #دفن کردن خروجی. fi FD_LOGEVENTS=7 if [[ $LOG_EVENTS ]] then # #سطر فوق در نگارشهای Bash جدیدتر از 2.04. ناموفق میگردد، چرا؟ exec 7>> /var/log/event.log #درج در انتهای فایل event.log log #نوشتن زمان و تاریخ. else exec 7> /dev/null #پنهان کردن خروجی. fi echo "DEBUG3: beginning" >&${FD_DEBUG3} ls -l >&5 2>&4 # echo "Done" #command2 echo "sending mail" >&${FD_LOGEVENTS} #"sending mail" را در توصیفگر فایل شماره 7 مینویسد. exit 0