Bash 스크립트에서 Ctrl-C 트랩을 사용하여 SSH 종료

Bash 스크립트에서 Ctrl-C 트랩을 사용하여 SSH 종료

첫 번째 스크립트에서 +를 누르면 Ctrl예상대로 작동하지만 +는 효과가 없습니다.CCtrlC

#!/bin/bash
trap '' INT
ssh user@server 'svn checkout ...'
echo "done"

그러나 두 번째 스크립트에서는 Ctrl+ C어떻게든 SSH 연결을 종료하고 스크립트의 다음 부분을 계속 진행합니다.

#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...'
echo "done"

Ctrl내 생각 에 두 번째 스크립트에서는 CSSH 연결을 종료하지 않고 "메시지"를 콘솔에 인쇄해야 한다고 생각합니다. 왜 이런 일이 발생합니까? 종료하지 않고 +를 누를 때마다 Ctrl일부 메시지를 인쇄할 수 있습니까?Cssh

답변1

내부는 ''매우 특별해요 trap '' <signame>. 결과 는 <signame>다음과 같습니다무시당하다, 가상 핸들러에 바인딩되지 않았습니다.

신호의 "무시" 처리는 자식 프로세스(예: ssh를 통해)에 상속되지만 신호 처리기에는 상속되지 않습니다.

trap '' INTtrap true INT와 다르거나 다릅니다 trap ' ' INT.

help trap이것은 bash에서 다음과 같은 내용을 알려줍니다.

ARG경우빈 문자열모두 SIGNAL_SPEC무시당하다쉘과 쉘이 호출하는 명령을 통해.


실제로 수행하려는 작업을 말하기는 어렵지만 명령을 종료 하지 않고 Ctrl- 키를 눌렀을 때 스크립트에서 메시지를 인쇄하도록 하려면 다음을 수행할 수 있습니다.Cssh

#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...' &
while :; do
        wait
        s=$?
        case $s in
        130)    ;;
        129|13?) kill -n "$((s - 128))" "$$";;
        *)      exit "$s";;
        esac
done
echo "done"

- ( )를 통해 스크립트를 종료할 수 있으려면 ssh ... &으로 변경하십시오.(trap - QUIT; trap '' INT; exec ssh ...) &Ctrl\SIGQUIT

관련 정보