我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键。在DOS中,这可以通过pause命令轻松完成。在我的脚本中是否有一个Linux等效程序?
当前回答
使用read是正确的——并且有一些调整使得它在cron和终端中都非常有用。
例子:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120使read语句在2分钟后超时,因此它不会在cron中阻塞。
在终端中,它给出2分钟来查看rsync命令执行了多长时间。
然后后续的回显是,因此后续的bash提示符将在下一行中出现。
否则,当在终端中按Enter键时,它将直接显示在“continue…”之后的同一行。
其他回答
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
我经常使用这些非常简短的方法,它们就像@theunamedguy和@Jim解决方案,但除此之外还有暂停和沉默模式。
我特别喜欢最后一种情况,并在许多循环运行的脚本中使用它,直到用户按下Enter。
命令
Enter solution read -rsp $'Press enter to continue...\n' Escape solution (with -d $'\e') read -rsp $'Press escape to continue...\n' -d $'\e' Any key solution (with -n 1) read -rsp $'Press any key to continue...\n' -n 1 key # echo $key Question with preselected choice (with -ei $'Y') read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; # echo $key Timeout solution (with -t 5) read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5; Sleep enhanced alias read -rst 0.5; timeout=$? # echo $timeout
解释
-r指定原始模式,不允许“\”或“^”这样的组合字符。
-s指定静默模式,因为我们不需要键盘输出。
-p $'prompt'指定提示符,需要在$'和'之间,以允许空格和转义字符。注意,你必须在单引号之间放上美元符号以利于转义字符,否则你可以使用简单的引号。
-d $'\e'指定转义符作为分隔符,因此作为当前条目的最后一个字符,可以放置任何字符,但要注意放置用户可以键入的字符。
-n 1指定只需要一个字符。
-e指定readline模式。
-i $'Y'指定Y作为readline模式的初始文本。
-t 5指定5秒的超时时间
如果你需要知道输入,在-n1情况下,是被按下的键。
$ ?用于知道上一个程序的退出码,用于读取,超时情况下142,正确输入0。把美元吗?在一个变量中,如果你需要在一些命令之后尽快测试它,因为所有的命令都会重写$?
这样,按下除ENTER以外的任何键仍然会转到新行
read -n1 -r -s -p "Press any key to continue..." ; echo
它比Windows暂停更好,因为你可以改变文本使它更有用
read -n1 -r -s -p "Press any key to continue... (cant find the ANY key? press ENTER) " ; echo
试试这个:
function pause(){
read -p "$*"
}
不带任何参数的读取将只在按enter键时继续。 如果您按下任何键,DOS暂停命令将继续。如果您想要这种行为,请使用read -n1。
推荐文章
- Linux Bash中双&和分号有什么区别?
- 如何合并2 JSON对象从2个文件使用jq?
- 在Bash中模拟do-while循环
- 在Bash中将输出赋给变量
- 在SSH会话中查找客户端的IP地址
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- 如何在Mac OS X 10.6中使硬件发出哔哔声
- Linux删除大小为0的文件
- 从Docker容器获取环境变量
- Spring引导应用程序作为服务
- 如何重定向标准derr和标准输出到不同的文件在同一行脚本?
- Windows和Linux上的c++编译:ifdef开关
- 如何循环通过一个目录递归删除具有某些扩展名的文件
- 在Bash中获取日期(比当前时间早一天)