파일에서 줄을 읽고 각 줄을 처리하는 스크립트가 있습니다. 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
답변1
후처리 기능에서는 /를 무시해야 합니다 ^C
.SIGINT
preprocess(){
yes baa
}
postprocess(){
sed 's/a/z/g'
}
preprocess | { trap '' INT; postprocess; sleep 1; echo DONE; }
파이프라인을 실행하고 키를 누르면 ^C
파이프 preprocess
라인이 종료되지만 postprocess
생성된 모든 출력이 소비될 때까지 계속 실행됩니다.preprocess
trap '' INT
(빈 문자열을 핸들러로 사용하는 것) 은 SIGINT
하위 프로세스에서도 무시됩니다. 왜냐하면 신호가 상위 프로세스에서 처리되고 있더라도 '^C'에 의해 trap 'echo INT trapped' INT
모든 등이 종료되기 때문입니다 .sed