Bash ввод «читать» остается открытым после Ctrl + C - PullRequest
0 голосов
/ 01 ноября 2018

TLDR

read функция не останавливает чтение ввода после того, как Ctrl + C , вместо этого она ожидает ввода данных пользователем в конце другой функции, которая следует после один это было в.

ОПИСАНИЕ

Итак, у меня есть скрипт стиля меню петли с несколькими функциями, по одной для каждой опции в меню.

Теперь проблема в одной из моих функций у меня такие строки:

printf "Enter your choice: "
read var_boxChoice

После того, как всплывающее диалоговое окно "Enter your choice: " и функция чтения начинает ждать ввода пользователя, я использую клавиши Ctrl + C , чтобы убить функцию (которая перехвачена с помощью команды trap 'f_menu' SIGINT над функцией главного меню, чтобы она не убивала весь скрипт), а затем меня переводят в главное меню (как и предполагалось).

После этого я выбираю другую функцию, в которой есть только этот код:

    clear
    printf "Feature is not yet implemented! \nReturning to the main menu in 5 seconds."
    sleep 5

И тогда возникает проблема. Вместо того, чтобы снова возвращаться в главное меню, после выполнения sleep 5 функция read из первой функции ожидает ввода пользователя. Я знаю, что это так, потому что механизм обработки ошибок ввода говорит мне, что read происходит от первой функции.

Что мне делать? Как убить ввод?

Боюсь, я не могу опубликовать больше кода, поэтому я извиняюсь впереди.

Спасибо!

EDIT:

Для тех, кому нужен весь код, вот небольшой пример, который я переделал для этой цели.

#!/bin/bash

var_answer1 = 0
var_answer2 = 0

f_blah1(){
    printf "Whatever 1"
    sleep 2
}

f_blah2(){
    printf "Whatever 2"
    sleep 2
}

f_option1(){
    clear
    printf "====================================================================\n"
    printf "What do you want to do?\n"
    printf "====================================================================\n"
    printf "1) Do this\n"
    printf "2) Do that\n"
    printf "====================================================================\n"
    printf "Enter your choice: "
    read var_answer2
    printf "====================================================================\n\n"
    sleep 1

    if [ "$var_answer2" -eq "1" ]; then
        f_blah1
    elif [ "$var_answer2" -eq "2" ]; then
        f_blah2
    else
        clear
        printf "====================================================================\n"
        printf "'$var_boxChoice' is not a viable answer!\nYou can only enter numbers 1 and 2!\n";
        printf "====================================================================\n"
        sleep 3
    fi
}

f_option2(){
    clear
    printf "Meh. I'm sleeping for 5 seconds. Then I'll return to main."
    sleep 5
}

trap 'f_menu' SIGINT

f_menu(){
    clear
    printf "====================================================================\n"
    printf "Select an option:\n"
    printf "====================================================================\n"
    printf "1) Option 1\n"
    printf "2) Option 2\n"
    printf "3) Quit\n"
    printf "====================================================================\n"
    printf "Enter your choice: "
    read var_answer1
    printf "====================================================================\n\n"
    sleep 0.5

    if [ "$var_answer1" -eq "1" ]; then
        f_option1
    elif [ "$var_answer1" -eq "2" ]; then
        f_option2
    elif [ "$var_answer1" -eq "3" ]; then
        printf "====================================================================\n"
        printf "Quitting the app... Thanks for using it!\n"
        printf "====================================================================\n"
        sleep 3
        clear
        exit
    else
        clear
        printf "====================================================================\n"
        printf "'$var_answer' is not a viable answer!\nYou can only enter numbers 1-3!\n";
        printf "====================================================================\n"
        sleep 2
    fi
}

while [ 1 > 0 ]
do 
    f_menu
done

1 Ответ

0 голосов
/ 01 ноября 2018

Ваша ловушка просто вызывает f_menu рекурсивно. Когда он возвращается, вы возвращаетесь туда, где вы были, когда произошел сигнал, который находится в команде read.

Я пытался поставить

trap 'continue' SIGINT

в цикле while, но это не сработало. После ввода Control-c мне пришлось нажать Return , чтобы все заработало.

Решение, которое я нашел, было поставить

trap 'return' SIGINT

в каждой из функций, отображающих меню.

#!/bin/bash

var_answer1 = 0
var_answer2 = 0

f_blah1(){
    printf "Whatever 1"
}

f_blah2(){
    printf "Whatever 2"
}

f_option1(){
    trap 'return' SIGINT
    printf "====================================================================\n"
    printf "What do you want to do?\n"
    printf "====================================================================\n"
    printf "1) Do this\n"
    printf "2) Do that\n"
    printf "====================================================================\n"
    printf "Enter your choice: "
    read var_answer2
    printf "====================================================================\n\n"

    if [ "$var_answer2" -eq "1" ]; then
        f_blah1
    elif [ "$var_answer2" -eq "2" ]; then
        f_blah2
    else
        printf "====================================================================\n"
        printf "'$var_boxChoice' is not a viable answer!\nYou can only enter numbers 1 and 2!\n";
        printf "====================================================================\n"
    fi
}

f_option2(){
    printf "Meh. I'm sleeping for 5 seconds. Then I'll return to main.\n"
}

f_menu(){
    trap 'return' SIGINT
    printf "====================================================================\n"
    printf "Select an option:\n"
    printf "====================================================================\n"
    printf "1) Option 1\n"
    printf "2) Option 2\n"
    printf "3) Quit\n"
    printf "====================================================================\n"
    printf "Enter your choice: "
    read var_answer1
    printf "====================================================================\n\n"

    if [ "$var_answer1" -eq "1" ]; then
        f_option1
    elif [ "$var_answer1" -eq "2" ]; then
        f_option2
    elif [ "$var_answer1" -eq "3" ]; then
        printf "====================================================================\n"
        printf "Quitting the app... Thanks for using it!\n"
        printf "====================================================================\n"
        exit
    else
        printf "====================================================================\n"
        printf "'$var_answer' is not a viable answer!\nYou can only enter numbers 1-3!\n";
        printf "====================================================================\n"
    fi
}

while :
do 
    f_menu
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...