트랩 및 exec를 사용하여 bash에서 출력을 티로 리디렉션

트랩 및 exec를 사용하여 bash에서 출력을 티로 리디렉션

파일에서 줄을 읽고 각 줄을 처리하는 스크립트가 있습니다. Ctrl+C를 눌러 스크립트가 모든 줄을 읽지 못하더라도 여전히 사후 처리를 수행할 수 있도록 "사후 처리"를 수행할 수 있기를 바랍니다. 이를 달성하기 위해 다음 두 가지 작업을 수행하려고 합니다.

  1. 나중에 해당 파일에서 사후 처리를 파일로 리디렉션하지만 무슨 일이 일어나고 있는지 확인하고 싶기 때문에 "tee"로 리디렉션하고 싶습니다.
  2. 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

관련 정보