BASH - ловушка CTRL + C - вы уверены, что подсказка не всегда работает - PullRequest
0 голосов
/ 08 июля 2019

Я добавил следующее в начало моего bash-скрипта:

quit() {

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

}

trap quit INT
trap quit SIGINT
trap quit SIGTERM

Сценарий задает пользователю ряд вопросов, а затем выполняет действия на основе результатов.Иногда кажется, что нажатие CTRL + C работает.

Но иногда я просто получаю Do you want to quit ? (y/n), и скрипт блокируется.Это может произойти, когда в операторе IF или в WHILE / DONE.

Но, похоже, если вы примете время CTRL + C, когда произойдет эхо, я смогу решить проблему .. т.е.: CTRL + C водновременно с эхом.

Есть ли способ всегда перехватывать CTRL + C и запрашивать пользователя?затем позвольте им решить, хотят ли они выйти или нет?

Этот код показывает, что проблема возникает ..

quit() {

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

}

trap quit INT
trap quit SIGINT
trap quit SIGTERM

for i in `seq 1 50`; do
    sleep 1
    echo -e "........"
    read -i "0000" -e site
done

Попробуйте назначить CTRL + C точно так же, как '........ 'и 0000 показывают на экране, и проблема возникает.

Кажется, это имеет большое значение.

quit() {

    while read -e -t 0.1; do : ; done
    read  -p "Do you want to quit ? (y/n) " n
    if [ "$n" = 'y' ]; then
        exit
    fi

}

Я изо всех сил пытаюсь сделать это сейчас.

Спасибо

1 Ответ

0 голосов
/ 08 июля 2019

Имена ловушек не должны начинаться с префикса SIG, поскольку они не определены.

Еще одна вещь, которую вы хотите сделать внутри обработчика ловушек: нейтрализовать ловушки, чтобы они не срабатывали, пока обрабатывается обработчик..

#!/usr/bin/env sh

quit() {
  trap false ABRT INT # Neutralize traps in the quit handler by assigning the false function
  printf '\nDo you want to quit ? (y/N)\n' # Uppercase N show the default choice
  read -r n
  case "${n}" in
    [yY]) # Match y or Y
      exit
    ;;
  esac
  trap quit ABRT INT # Re-enable traps on self
}

trap quit ABRT INT # Attach the SIGABRT and SIGINT traps to the quit function
i=1
while true; do
  echo "$i"
  i=$((i+1))
  sleep 1
done

Образец прогона:

1
2
^C
Do you want to quit ? (y/n)
n
3
4
^C
Do you want to quit ? (y/n)
^C5
6
7
8
^C
Do you want to quit ? (y/n)
y
...