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
그러나 명령이 활발히 실행되는 동안에는 신호가 전달되지 않기 때문에 쉘 옵션이 활성화( )되지 않으면 예상대로 작동하지 않습니다 (" 참조).Bash는 'select' 루프가 실행될 때 SIGINT 트랩을 무시합니다.").
이는 통화 set -o posix
전 select
(및 가능하면 통화 후에)을 사용 하고 싶을 수도 있음을 의미합니다 .set +o posix