按 ENTER 继续

按 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"
}

答案1

我必须承认我没有足够彻底地阅读这个问题。原因之一是您的意图与终端设置根本无关,但无论如何icrnl都是默认设置。

[ -z "${hold#$in}" ]是一种相当奇怪的表达[ "$in" = ' ' ]or 的方式[ "$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'

等待Enterread

head -n 1 >/dev/null

这可以取代整个until循环,但仅限于换行符。

相关内容