题
我有一个 Bash shell 脚本,我想在其中暂停执行,直到用户按下某个键。在 DOS 中,这可以通过“暂停”命令轻松完成。我可以在脚本中使用 Linux 等效项吗?
解决方案
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
其他提示
我经常使用这些非常短的方法,它们就像@theunamedguy 和@Jim 解决方案,但另外还有超时和静默模式。
我特别喜欢最后一种情况,并在许多循环运行的脚本中使用它,直到用户按下 进入.
命令
输入解决方案
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 指定为 readline 模式下的初始文本。
-t 5 指定 5 秒的超时时间
钥匙 如果您需要知道输入(在 -n1 情况下),则为已按下的键提供服务。
$? 用于知道最后一个程序的退出代码,用于读取,142 超时,0 正确输入。把$?如果您需要在某些命令之后测试它,请尽快在变量中,因为所有命令都会重写 $?
read
不带任何参数只有按 Enter 键才会继续。操作系统 pause
如果按任意键,命令将继续。使用 read –n1
如果你想要这种行为。
这对我来说在多种版本的 Linux 上都有效,而其他一些解决方案却不起作用(包括这里最流行的解决方案)。我认为它也更具可读性...
echo Press enter to continue; read dummy;
请注意,需要提供一个变量作为参数 read
.
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
如果您只需要暂停循环或脚本,并且您乐意按 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
为了大正义!
尝试这个:
function pause(){
read -p "$*"
}
是的,可以使用 read
- 并且有一些调整使其在这两个方面都最有用 cron
并在终端中。
例子:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120 使读取语句在 2 分钟后超时,因此不会阻塞 cron
.
在终端中,它给出 2 分钟的时间来查看需要多长时间 rsync
命令需要执行。
那么接下来的 echo
这样后续的 bash 提示符就会出现在下一行。
否则,它将在“继续...”之后直接显示在同一行上 进入 在终端中按下。