我有从文件中读取行的脚本,处理每一行。我希望能够以某种方式进行一些“后处理”,即使脚本没有完成读取所有行,因为我按下了 Ctrl+C,它仍然会进行后处理。为了实现这一点,我正在尝试执行以下两项操作:
- 将标准输出重定向到文件;稍后从该文件进行后处理,但是我想看看发生了什么,所以我想重定向到“tee”
- 捕获 Ctrl+C 并在那里进行后期处理
我设法使 1 或 2 工作,但不能同时工作:
#!/bin/bash
# 2. Either this works
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
echo "** Trapped CTRL-C"
}
# 1. Or this works
LOGFILE=/tmp/${FILE}.tee
rm ${LOGFILE}
exec > >(tee ${LOGFILE}) 2>&1
function post_process() {
# use ${LOGFILE}
}
egrep "(${URL_PATH})" ${FILE} |
while read LINE ; do
#...
done
post_process
您应该忽略后处理函数中的
^C
/ :SIGINT
当您运行该管道并按
^C
时,preprocess
将被杀死,但postprocess
会继续运行,直到preprocess
消耗掉所有产生的输出。请注意,
trap '' INT
(以空字符串作为处理程序)也将SIGINT
在子进程中忽略;不要用例如替换它。trap 'echo INT trapped' INT
因为这将导致 anysed
等被 '^C' 杀死,尽管在父进程中处理了信号。