20.3 应用程序

使用 I/O 重定向可以同时解析和固定命令输出的片段(see 样例 15-7). 这也使得可以生成报告和日志文件.

样例 20-12. 日志记录事件

  1. #!/bin/bash
  2. # logevents.sh
  3. # 作者: Stephane Chazelas.
  4. # 用于 ABS 许可指南.
  5. # 事件记录到文件.
  6. # 必须 root 身份执行 (可以写入 /var/log).
  7. ROOT_UID=0 # 只有 $UID 为 0 的用户具有 root 权限.
  8. E_NOTROOT=67 # 非 root 会报错.
  9. if [ "$UID" -ne "$ROOT_UID" ]
  10. then
  11. echo "Must be root to run this script."
  12. exit $E_NOTROOT
  13. fi
  14. FD_DEBUG1=3
  15. FD_DEBUG2=4
  16. FD_DEBUG3=5
  17. # === 取消下面两行注释来激活脚本. ===
  18. # LOG_EVENTS=1
  19. # LOG_VARS=1
  20. log() # 时间和日期写入日志文件.
  21. {
  22. echo "$(date) $*" >&7 # *追加* 日期到文件.
  23. # ^^^^^^^ 命令替换
  24. # 见下文.
  25. }
  26. case $LOG_LEVEL in
  27. 1) exec 3>&2 4> /dev/null 5> /dev/null;;
  28. 2) exec 3>&2 4>&2 5> /dev/null;;
  29. 3) exec 3>&2 4>&2 5>&2;;
  30. *) exec 3> /dev/null 4> /dev/null 5> /dev/null;;
  31. esac
  32. FD_LOGVARS=6
  33. if [[ $LOG_VARS ]]
  34. then exec 6>> /var/log/vars.log
  35. else exec 6> /dev/null # 清空输出.
  36. fi
  37. FD_LOGEVENTS=7
  38. if [[ $LOG_EVENTS ]]
  39. then
  40. # exec 7 >(exec gawk '{print strftime(), $0}' >> /var/log/event.log)
  41. # 上述行在最近高于 bash 2.04 版本会失败,为什么?
  42. exec 7>> /var/log/event.log # 追加到 "event.log".
  43. log # 写入时间和日期.
  44. else exec 7> /dev/null # 清空输出.
  45. fi
  46. echo "DEBUG3: beginning" >&${FD_DEBUG3}
  47. ls -l >&5 2>&4 # 命令1 >&5 2>&4
  48. echo "Done" # 命令2
  49. echo "sending mail" >&${FD_LOGEVENTS}
  50. # 输出信息 "sending mail" 到文件描述符 #7.
  51. exit 0