我有一个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…”之后的同一行。