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
}

신호를 포착하면 필요에 따라 프로그램이 신호에 응답하여 수행하기를 원하는 작업을 구현할 수 있습니다.

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

이는 통화 set -o posixselect(및 가능하면 통화 후에)을 사용 하고 싶을 수도 있음을 의미합니다 .set +o posix

관련 정보