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
.