在脚本中使用 Bash 信号捕获 | Linux 中国( 二 )

如果要在 Bash 中实现信号捕获 , 只需要在 trap 后加上需要执行的命令 , 再加上需要捕获的信号列表就可以了 。
例如 , 下面的这行语句可以捕获到在进程运行时用户按下 Ctrl + C 组合键发出的 SIGINT 信号:
trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT因此 , 上文中脚本的缺陷可以通过使用 trap 捕获 SIGINT、SIGTERM、进程错误退出、进程正常退出等信号 , 并正确处理临时目录的方式来修复:
#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir}trap \ "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \ SIGINT SIGTERM ERR EXIT## create tmp dirmkdir "${TMP}"tar xf "${1}" --directory "${TMP}"## move to tmp and run commandspushd "${TMP}"for IMG in *.jpg; domogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg## move back to originpopd## zip tarbzip2 --compress $TMP/"${1%.*}".tar \--stdout > "${1%.*}".tbz对于更复杂的功能 , 还可以用 Bash 函数 来简化 trap 语句 。
Bash 中的信号捕获信号捕获可以让脚本在无论是否成功执行所有任务的情况下都能够正确完成清理工作 , 能让你的脚本更加可靠 , 这是一个很好的习惯 。 尽管尝试把信号捕获加入到你的脚本里看看能够起到什么作用吧 。
【在脚本中使用 Bash 信号捕获 | Linux 中国】via: opensource.com
作者: Seth Kenlon 选题: lujun9972 译者: HankChow 校对: wxy
本文由 LCTT 原创编译 ,Linux中国 荣誉推出
点击“了解更多”可访问文内链接