BASH Trap CTRL+C, затем полностью выйти из скрипта

Я добавил ловушку в свой сценарий bash, поэтому при нажатии CTRL+C появляется сообщение Do you want to quit ? (y/n)

Это работает в большинстве частей сценария, но не работает в других.

Я создал простой пример, который показывает, что он всегда терпит неудачу.

#!/bin/bash

quit() {
echo "Do you want to quit ? (y/n)"
  read ctrlc
  if [ "$ctrlc" = 'y' ]; then
    exit
  fi
}

trap quit SIGINT
trap quit SIGTERM

while true; do
    echo -e "\n\e[91mIs everything done ? (y/n)\e[0m"
    read -i "y" -e yn
    case $yn in
        [Nn]* ) continue;;
        [Yy]* ) 

        echo -e "Done"
        break;;
        * ) echo -e "\e[91mPlease answer yes or no.\e[0m";;
    esac
done

Почему, когда я нажимаю CTRL+C, это всплывает Do you want to quit ? (y/n), но не позволяет мне выйти? Как мне это решить?

Спасибо


person Tom    schedule 10.05.2019    source источник
comment
У меня это работает (после удаления -i и -e из чтения) в bash 3.2.57 и 4.4.12.   -  person William Pursell    schedule 10.05.2019
comment
Проблема, кажется, в -e. Добавьте -e к чтению в ловушке   -  person William Pursell    schedule 10.05.2019
comment
Примечание: внутри функции exit рассматривается как синоним return и не завершает программу. Есть ли какое-то специальное разрешение для функций, вызываемых ловушкой?   -  person Paul Hodges    schedule 10.05.2019
comment
... есть ли пустая строка над вашим #!/bin/bash шебангом? Потому что это не сработает и станет просто комментарием.   -  person Paul Hodges    schedule 10.05.2019


Ответы (2)


Приведенный выше код работает без ошибок в оболочке bash. Я подозреваю, что вы запустили сценарий в dash SHELL (оболочкой по умолчанию на некоторых машинах является dash).

Запустите свой скрипт, используя следующие методы:

/бин/баш

or

Дайте разрешение на выполнение вашему файлу сценария (chmod 777 script.sh) и запустите файл, как показано ниже:

./script.sh

person sprabhakaran    schedule 10.05.2019

Как я уже говорил выше, внутри функции выход рассматривается как синоним возврата и не завершает программу. Если это ваша проблема, попробуйте

kill -term $$ # send this program a terminate signal

вместо просто exit. Это жестко, но в целом эффективно.

Обратите внимание, что если у вас также есть ловушка SIGTERM, которая будет выполнена.

person Paul Hodges    schedule 10.05.2019