我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键。在DOS中,这可以通过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是正确的——并且有一些调整使得它在cron和终端中都非常有用。
例子:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120使read语句在2分钟后超时,因此它不会在cron中阻塞。
在终端中,它给出2分钟来查看rsync命令执行了多长时间。
然后后续的回显是,因此后续的bash提示符将在下一行中出现。
否则,当在终端中按Enter键时,它将直接显示在“continue…”之后的同一行。
我已经建立了一个小程序来实现暂停命令在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兼容。
这在多种Linux版本上都适用,而其他一些解决方案(包括这里最受欢迎的解决方案)则不适用。我认为它也更有可读性…
echo Press enter to continue; read dummy;
注意,需要将变量作为参数提供以供读取。
如果您只是需要暂停一个循环或脚本,并且您很乐意按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代表大正义!
推荐文章
- 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 ?