3

I have a select menu with 4 options. I want that in case of pressing ctrl + c, remove some files before terminating the program. Here is my code:

#!/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

but when I run this code and press ctrl + c, nothing happens and the program is not terminated, just ^c is typed. What's wrong?

5

Ctrl + C sends the SIGINT signal, but you are capturing that and assigning it to your ctrl_c function:

trap ctrl_c INT

So when you press Ctrl + C, your script will execute the function instead of quitting. If that's not what you want, remove the trap command.

If your objective is to run the ctrl_c function and then exit, you need to tell your script to exit explicitly:

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

When you trap a signal, it is up to you to implement what you want your program to do in response to that signal.

This will however not work as expected unless the posix shell option is active (set -o posix) as signals are not delivered while a command is actively executing (see "Bash ignoring SIGINT trap when 'select' loop is running").

This means that you may want to use set -o posix before calling select (and then possibly set +o posix afterwards).

| improve this answer | |
  • Hi folks. Please don't use comments for discussion like this. I have moved this to a chat room instead. @pablo – terdon Apr 10 at 11:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.