Answers:
read
做这个:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
该-n1
指定它只是等待一个字符。在-r
将其放入原始模式,这是必要的,否则,如果按类似反斜杠,它不会注册,直到你遇到下一个关键。在-p
指定的提示,如果包含空格,必须用引号括起来。key
仅当您想知道他们按下了哪个键时才需要该参数,在这种情况下,您可以通过以下方式访问它$key
。
如果您使用的是Bash,则还可以使用来指定超时-t
,这会导致未按任何键时read返回失败。因此,例如:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
Press a key to continue...
那么即使是新手用户也可以找到该a
密钥并按下它; o)
read: 1: read: Illegal option -n
确保将您的命令包装在bash -c 'command && command'
等中,因为该错误很可能来自sh
。我正在用Lando包装器命令执行此操作。
我使用了很多非常简短的方法,它们就像@theunamedguy和@Jim解决方案一样,但是还有超时和静默模式。
我特别喜欢最后一种情况,并将其用在许多循环运行的脚本中,直到用户按下为止Enter。
输入解决方案
read -rsp $'Press enter to continue...\n'
转义解决方案 (带有-d $'\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
任何关键解决方案 (带有-n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
具有预选选项的问题 (带有-ei $'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
超时解决方案 (使用-t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
睡眠增强别名
read -rst 0.5; timeout=$?
# echo $timeout
-r指定原始模式,该模式不允许使用诸如“ \”或“ ^”之类的组合字符。
-s指定静默模式,并且因为我们不需要键盘输出。
-p $' 提示符 '指定提示符,提示符必须在$'和'之间,以允许空格和转义字符。注意,必须在单引号之间加上美元符号以使转义字符受益,否则可以使用简单的引号。
-d $' \ e '将 escappe指定为分隔符,因此作为当前输入的最后一个字符,可以放置任何字符,但请小心放置用户可以键入的字符。
-n 1指定仅需要一个字符。
-e指定读取行模式。
-i $' Y '在读取行模式下将Y指定为初始文本。
-t 5指定5秒的超时
关键服务的情况下,你需要知道的投入,在-N1的情况下,已被按下的键。
$?用于了解最后一个程序的退出代码,以供读取;如果超时,则为142,正确的输入为0。放$?如果需要在某些命令后对其进行测试,请尽快将其放入变量中,因为所有命令都会重写$?
-s
; man read
和read --help
帮助在Ubuntu 10.04.1 LTS上无济于事。编辑:help read
做了;是否已弃用?
read: -i: invalid option
对前任有所了解。read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
在#osx上read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
适合我。`
-i
可以在Ubuntu上完美地工作,而且我也不知道-d
在OSX上如何工作。
read -n1
不便携。一种可移植的方法可以是:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
除了使用 read
,只需按一下ENTER
即可继续提示,您可以执行以下操作:
sed -n q </dev/tty
status=none
也不是便携式的。将stdout和stderr重定向到/ dev / null。按ENTER ...read -r line < /dev/tty
就足够了。
settings=$(stty -g); stty raw; dd ...; stty "$settings"
保存和恢复tty设置。
tr
编辑的东西也可以工作吗?
tr
会将其输出缓冲为管道,并且非美国键盘的键会发送超出\1-\177
范围的字符。dd
这是惯用的方式。
如果您只需要暂停循环或脚本,并且很乐意按Enter键而不是任何键,则read
可以自行完成此工作。
do_stuff
read
do_more_stuff
它不是最终用户友好的,但是在您自己编写快速脚本并且需要暂停它以在后台手动执行某些操作的情况下,这可能就足够了。
此功能可在bash
和中使用zsh
,并确保对终端的I / O:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
将其放入.{ba,z}shrc
大正义中!
"Enter any non-NUL character to continue"
。一些键不发送任何字符(如Ctrl
...),而某些键则发送多个字符(如F1
,Home
...)。bash
忽略NUL字符。