我有一个Bash shell脚本,我想在其中暂停执行,直到用户按下某个键为止。 在DOS中,可以使用" pause"命令轻松完成此操作。 我可以在脚本中使用等效的Linux吗?
read这样做:
1 2 3
| user@host:~$ read -n1 -r -p"Press any key to continue..." key
[...]
user@host:~$ |
-n1指定仅等待一个字符。 -r会将其置于原始模式,这是必需的,因为否则,如果您按反斜杠之类的东西,则在您按下下一个键之前它不会注册。 -p指定提示,如果提示包含空格,则必须将其引起来。仅当您想知道他们按下了哪个键时才需要key参数,在这种情况下,您可以通过$key访问它。
如果使用的是Bash,则还可以使用-t指定超时,这将导致在未按下键时read返回失败。因此,例如:
1 2 3 4 5 6
| 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 |
我使用了很多非常简短的方法,它们就像@theunamedguy和@Jim解决方案一样,但是还有超时和静默模式。
我特别喜欢最后一种情况,并在许多循环运行的脚本中使用它,直到用户按下Enter。
指令
-
输入解决方案
1 2
| read -rsp $'Press enter to continue...
' |
-
转义解决方案(带有-d $' e')
1 2
| read -rsp $'Press escape to continue...
' -d $'\e' |
-
任何关键解决方案(带有-n 1)
1 2 3
| read -rsp $'Press any key to continue...
' -n 1 key
# echo $key |
-
具有预选选项的问题(带有-ei $'Y')
1 2
| read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key |
-
超时解决方案(带有-t 5)
1 2
| read -rsp $'Press any key or wait 5 seconds to continue...
' -n 1 -t 5; |
-
睡眠增强别名
1 2
| read -rst 0.5; timeout=$?
# echo $timeout |
说明
-r指定原始模式,该模式不允许使用诸如""或" ^"之类的组合字符。
-s指定静默模式,并且因为我们不需要键盘输出。
-p $'prompt'指定提示,提示必须在$'和'之间,以允许空格和转义字符。注意,必须在单引号之间加上美元符号以使转义字符受益,否则可以使用简单的引号。
-d $' e'指定escappe作为分隔符,因此,作为当前输入的最后一个字符,可以放置任何字符,但请小心放置用户可以键入的字符。
-n 1指定仅需要一个字符。
-e指定读取行模式。
-i $'Y'在读取行模式下将Y指定为初始文本。
-t 5指定5秒的超时
如果您需要知道输入,则在-n1情况下使用按键服务。
$?用于知道最后一个程序的退出代码,以供读取;如果超时,则为142,正确的输入为0。放$?如果需要在某些命令后对其进行测试,请尽快将其放入变量中,因为所有命令都会重写$?
这对我来说适用于多种版本的Linux,而其他一些解决方案则没有(包括此处最受欢迎的解决方案)。我认为它也更具可读性...
1
| echo Press enter to continue; read dummy; |
请注意,需要提供变量作为read的参数。
没有任何参数的read仅在您按Enter键时才会继续。
如果您按任意键,DOS pause命令将继续。如果需要此行为,请使用read –n1。
read -n1不可移植。一种可移植的方法可以是:
1 2 3
| ( trap"stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty |
除了使用read,只需按ENTER继续提示,您可以执行以下操作:
如果只需要暂停循环或脚本,并且很高兴按Enter键而不是任何键,那么read本身就可以完成任务。
1 2 3
| do_stuff
read
do_more_stuff |
它不是最终用户友好的,但是在您自己编写快速脚本的情况下可能就足够了,您需要暂停它以在后台手动执行某些操作。
此功能在bash和zsh中均有效,并确保对终端的I / O:
1 2 3 4 5 6 7 8 9
| # 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 '
'
}
export_function pause |
把它放在您的.{ba,z}shrc中,以求正义!
尝试这个:
1 2 3
| function pause(){
read -p"$*"
} |
是的,对于使用read-进行了一些调整,使其在cron和终端中最有用。
例:
1 2
| time rsync (options)
read -n 120 -p"Press 'Enter' to continue..." ; echo"" |
-n 120使读取语句在2分钟后超时,因此它不会在cron中阻塞。
在终端中,有2分钟的时间来查看rsync命令执行所需的时间。
然后,后面的echo是,因此后面的bash提示将出现在下一行。
否则,在终端中按Enter时,它将在" continue ..."之后直接在同一行上显示。