ctrl + c를 누른 후에도 스크립트가 종료되지 않습니다

ctrl + c를 누른 후에도 스크립트가 종료되지 않습니다

4가지 옵션이 있는 선택 메뉴가 있습니다. ctrl + c를 누르는 경우 프로그램을 종료하기 전에 일부 파일을 제거하고 싶습니다. 내 코드는 다음과 같습니다.

#!/bin/bash

ctrl_c() {
     test -f directory/file.txt && rm directory/file.txt
}

trap ctrl_c INT

PS3='Please enter your choice: '
while true; do
    clear
    options=("Option 1" "Option 2" "Option 3" "Exit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Option 1")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Option 2")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Option 3")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Exit")
                break 2
                ;;
            *) echo "invalid option $REPLY";;
        esac
    done
read -p "Press [Enter] key to continue..."
done

하지만 이 코드를 실행하고 ctrl + c를 누르면 아무 일도 일어나지 않고 프로그램이 종료되지 않고 ^c입력만 됩니다. 뭐가 문제 야?

답변1

Ctrl+는 CSIGINT 신호를 보내지만 이를 캡처하여 ctrl_c함수에 할당합니다.

trap ctrl_c INT

Ctrl따라서 + 를 누르면 C스크립트가 종료되는 대신 함수가 실행됩니다. 원하는 내용이 아닌 경우 해당 trap명령을 제거하세요.

함수 를 실행한 후 종료하는 것이 목표라면 ctrl_c스크립트에 명시적으로 종료하도록 지시해야 합니다.

ctrl_c() {
     test -f directory/file.txt && rm directory/file.txt
     exit
}

신호를 트랩할 때 해당 신호에 응답하여 프로그램이 수행하기를 원하는 작업을 구현하는 것은 사용자에게 달려 있습니다.

그러나 명령이 활발히 실행되는 동안 신호가 전달되지 않으므로 posix쉘 옵션이 활성화( ) 되지 않으면 예상대로 작동하지 않습니다 (" 참조).set -o posix'select' 루프가 실행 중일 때 Bash가 SIGINT 트랩을 무시함").

set -o posix이는 전화하기 전에 select(그리고 나중에라도 ) 사용하고 싶을 수도 있다는 뜻입니다 set +o posix.

관련 정보