我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键。在DOS中,这可以通过pause命令轻松完成。在我的脚本中是否有一个Linux等效程序?
当前回答
这在多种Linux版本上都适用,而其他一些解决方案(包括这里最受欢迎的解决方案)则不适用。我认为它也更有可读性…
echo Press enter to continue; read dummy;
注意,需要将变量作为参数提供以供读取。
其他回答
我已经建立了一个小程序来实现暂停命令在Linux。我已经在我的GitHub回购上传了代码。
要安装它,
git clone https://github.com/savvysiddharth/pause-command.git
cd pause-command
sudo make install
安装后,您现在可以使用类似于在windows中所做的暂停命令。
它还支持可选的自定义字符串,如read。
例子:
pause "Pausing execution, Human intervention required..."
使用这个,C/ c++程序使用像system("pause");现在与linux兼容。
我经常使用这些非常简短的方法,它们就像@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。把美元吗?在一个变量中,如果你需要在一些命令之后尽快测试它,因为所有的命令都会重写$?
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
这样,按下除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
使用read是正确的——并且有一些调整使得它在cron和终端中都非常有用。
例子:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120使read语句在2分钟后超时,因此它不会在cron中阻塞。
在终端中,它给出2分钟来查看rsync命令执行了多长时间。
然后后续的回显是,因此后续的bash提示符将在下一行中出现。
否则,当在终端中按Enter键时,它将直接显示在“continue…”之后的同一行。
推荐文章
- fork(), vfork(), exec()和clone()的区别
- 如何从查找“类型d”中排除此/ current / dot文件夹
- 检查bash变量是否等于0
- 在tmux中保持窗口名称固定
- 只使用md5sum获取哈希值(没有文件名)
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 使用sh shell比较字符串
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 如何删除超过X小时的文件
- 如何创建Bash别名?
- 如何设置ssh超时时间?
- 将所有变量从一个shell脚本传递到另一个?
- 只列出UNIX中的目录
- 如何在Apache服务器上自动将HTTP重定向到HTTPS ?