Я хочу знать, есть ли способ остановить мой скрипт до тех пор, пока пользователь не нажмет клавишу 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"
}
Должен признаться, что недостаточно внимательно прочитал вопрос. Одна из причин заключается в том, что ваше намерение вообще не связано с настройками терминала, за исключением 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
, но будет ограничено новой строкой.