수색…


통사론

  • trap action sigspec ... # 신호 목록에서 "action"실행
  • trap sigspec ... # 생략하는 동작은 신호에 대한 트랩을 재설정합니다.

매개 변수

매개 변수 의미
-피 현재 설치된 트랩 나열
-엘 신호 이름 및 해당 번호 나열

비고

trap 유틸리티는 내장 된 특수 쉘입니다. POSIX에 정의되어 있지만 bash는 유용한 확장을 추가합니다.

POSIX 호환 #!/bin/sh 시작하는 예제와 #!/bin/bash 시작하는 예제는 bash 확장자를 사용합니다.

신호는 신호 번호, 신호 이름 (SIG 프리픽스 없음) 또는 특수 키워드 EXIT 중 하나 일 수 있습니다.

POSIX에 의해 보장되는 것들은 :

번호 이름 노트
0 출구 종료 코드에 관계없이 항상 쉘 exit에서 실행
1 SIGHUP
2 SIGINT 이것은 ^C 보내는 것입니다.
SIGQUIT
6 SIGABRT
9 알래스카
14 SIGALRM
15 명 시걸 이것은 kill 이 기본적으로 보내는 것입니다.

SIGINT 또는 Ctl + C 잡기

트랩은 서브 쉘을 위해 리셋되므로 sleep 은 여전히 ^C (보통 종료 함)에 의해 보내진 SIGINT 신호에서 작동하지만 부모 프로세스 (즉, 쉘 스크립트)는 그렇지 않습니다.

#!/bin/sh

# Run a command on signal 2 (SIGINT, which is what ^C sends)
sigint() {
    echo "Killed subshell!"
}
trap sigint INT

# Or use the no-op command for no output
#trap : INT

# This will be killed on the first ^C
echo "Sleeping..."
sleep 500

echo "Sleeping..."
sleep 500

그리고 여전히 ^C 두 번 눌러 메인 프로그램을 종료 할 수있는 변형이 있습니다 :

last=0
allow_quit() {
    [ $(date +%s) -lt $(( $last + 1 )) ] && exit
    echo "Press ^C twice in a row to quit"
    last=$(date +%s)
}
trap allow_quit INT

소개 : 임시 파일 정리

trap 명령을 사용하여 신호를 "트랩"할 수 있습니다. C 및 다른 대부분의 프로그래밍 언어에서 signal() 또는 sigaction() 호출과 동일한 쉘로 signal() 를 포착합니다.

trap 의 가장 일반적인 용도 중 하나는 예상치 못한 예기치 않은 종료시 임시 파일을 정리하는 것입니다.

불행히도 쉘 스크립트가 충분하지 않습니다 :-(

#!/bin/sh

# Make a cleanup function
cleanup() {
  rm --force -- "${tmp}"
}

# Trap the special "EXIT" group, which is always run when the shell exits.
trap cleanup EXIT

# Create a temporary file
tmp="$(mktemp -p /tmp tmpfileXXXXXXX)"

echo "Hello, world!" >> "${tmp}"

# No rm -f "$tmp" needed. The advantage of using EXIT is that it still works
# even if there was an error or if you used exit.

출구에서 실행할 트랩 작업 목록을 누적하십시오.

임시 파일을 정리하거나 종료 할 때 다른 작업을 수행하는 trap 을 추가하는 것을 잊어 본 적이 있습니까?

다른 트랩을 취소 한 트랩을 설정 한 적이 있습니까?

이 코드를 사용하면 코드의 어딘가에 하나의 큰 trap 문을 사용하는 대신 한 번에 하나의 항목을 종료 할 때 수행 할 작업을 쉽게 추가 할 수 있으므로 잊기 쉽습니다.

# on_exit and add_on_exit
# Usage:
#   add_on_exit rm -f /tmp/foo
#   add_on_exit echo "I am exiting"
#   tempfile=$(mktemp)
#   add_on_exit rm -f "$tempfile"
# Based on http://www.linuxjournal.com/content/use-bash-trap-statement-cleanup-temporary-files
function on_exit()
{
    for i in "${on_exit_items[@]}"
    do
        eval $i
    done
}
function add_on_exit()
{
    local n=${#on_exit_items[*]}
    on_exit_items[$n]="$*"
    if [[ $n -eq 0 ]]; then
        trap on_exit EXIT
    fi
}

종료시 하위 프로세스 종료

트랩 표현식은 개별 함수 또는 프로그램 일 필요는 없으며보다 복잡한 표현식이 될 수도 있습니다.

jobs -pkill 을 조합함으로써 exit시 쉘의 생성 된 모든 하위 프로세스를 종료 할 수 있습니다.

trap 'jobs -p | xargs kill' EXIT

터미널 창 크기의 변화에 ​​반응한다.

WINCH (WINdowCHange) 신호가 있습니다.이 신호는 터미널 창 크기를 조정할 때 발생합니다.

declare -x rows cols
 
update_size(){
  rows=$(tput lines) # get actual lines of term
  cols=$(tput cols)  # get actual columns of term
  echo DEBUG terminal window has no $rows lines and is $cols characters wide
}

trap update_size WINCH


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow