Нажмите ENTER, чтобы продолжить

Я хочу знать, есть ли способ остановить мой скрипт до тех пор, пока пользователь не нажмет клавишу Enter, но без использования команды . ] read, только по параметрам stty.

Я искал код для этого и нашел его; поэтому я нашел код, которому для продолжения требуется «пробел», и изменил переменную holdс пустого места на \n, но безуспешно.

Вот как это выглядит:

function _enter-to-continue() {
    local hold='\n'        # this solution i tried, but without success

    printf "Press 'ENTER' to continue or 'ESC' to cancel... "
    local original_tty_state=$(stty -g)
    trap "stty $original_tty_state; exit 0" 2
    stty intr \033

    stty raw isig noflsh echo icrnl

    until [ -z "${hold#$in}" ]; do
        in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
    done

    stty "$original_tty_state"
}
0
19.06.2020, 21:21
1 ответ

Должен признаться, что недостаточно внимательно прочитал вопрос. Одна из причин заключается в том, что ваше намерение вообще не связано с настройками терминала, за исключением icrnl, которая в любом случае является настройкой по умолчанию.

[ -z "${hold#$in}" ]— довольно странный способ выразить [ "$in" = ' ' ]или [ "$hold" = "$in" ]. Проблема или ваш код в том, что $(cmd)удаляет завершающую новую строку. Вы ждете только новой строки... Таким образом, требуемый символ никогда не появляется в тестовом коде. Вам нужно

in=$(dd bs=1 count=1 </dev/tty 2>/dev/null; echo x)
in="${in%x}"

Другая проблема local hold='\n'. Это не работает, это не C. Вам нужно

hold='
'
# or
hold=$'\n'

Ожидание Введите безread

head -n 1 >/dev/null

Это может заменить весь цикл until, но будет ограничено новой строкой.

1
18.03.2021, 23:26

Теги

Похожие вопросы