我想知道是否有任何方法可以让我的脚本停止,直到用户按下按键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'
等待Enter无read
head -n 1 >/dev/null
这可以取代整个until
循环,但仅限于换行符。