263

我有一个 Bash shell 脚本,我想在其中暂停执行,直到用户按下一个键。在 DOS 中,这很容易通过pause命令完成。我可以在我的脚本中使用 Linux 等价物吗?

4

11 回答 11

355

read做这个:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1指定它只等待一个字符。将-r其置于原始模式,这是必要的,否则,如果您按下反斜杠之类的东西,它不会注册,直到您按下下一个键。-p指定提示,如果它包含空格,则必须用引号引起来。仅当您想知道他们按下了哪个键时,才需要该key参数,在这种情况下,您可以通过$key.

如果您使用 Bash,您还可以使用 指定超时-t,这会导致读取在未按下键时返回失败。例如:

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
于 2008-09-18T14:03:44.610 回答
172

我经常使用这些非常短的方法,它们就像@theunamedguy 和@Jim 解决方案,但还具有超时和静默模式。

我特别喜欢最后一种情况,并在许多循环运行的脚本中使用它,直到用户按下Enter.

命令

  • 输入解决方案

    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 $' prompt '指定提示符,它需要在 $' 和 ' 之间以允许空格和转义字符。请注意,您必须在带有美元符号的单引号之间放置以使转义字符受益,否则您可以使用简单引号。

-d $' \e '将转义符指定为分隔符,因此作为当前条目的最后一个字符,可以放置任何字符,但要小心放置用户可以键入的字符。

-n 1指定它只需要一个字符。

-e指定 readline 模式。

-i $' Y '将 Y指定为 readline 模式下的初始文本。

-t 5指定超时 5 秒

服务以防您需要知道输入,在 -n1 情况下,是已按下的键。

美元?用于知道最后一个程序的退出代码,用于读取,142超时,0正确输入。放$? 如果您需要在某些命令之后对其进行测试,请尽快在变量中进行测试,因为所有命令都会重写 $?

于 2013-07-22T01:42:11.927 回答
16

read没有任何参数只会在你按下回车后继续。pause如果按任意键,DOS命令将继续。read –n1如果您想要这种行为,请使用。

于 2008-09-18T14:15:12.007 回答
16

这对我来说适用于多种 Linux 风格,而其中一些其他解决方案没有(包括这里最流行的解决方案)。我也觉得它更易读...

echo Press enter to continue; read dummy;

请注意,需要将变量作为参数提供给read.

于 2017-01-18T20:01:15.000 回答
13

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
于 2014-06-04T20:22:23.493 回答
3

如果您只需要暂停一个循环或脚本,并且您很乐意按 Enter 而不是任何键,那么read它自己就可以完成这项工作。

do_stuff
read
do_more_stuff

它对最终用户不友好,但在您为自己编写快速脚本并且需要暂停它以在后台手动执行某些操作的情况下可能就足够了。

于 2016-09-22T11:40:11.103 回答
3

此函数适用于bashzsh,并确保对终端的 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的大正义中!

于 2018-06-28T05:28:44.380 回答
2

这修复了它,因此按 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
于 2021-09-02T17:56:52.947 回答
0

是的使用read- 并且有一些调整使其cron在终端和终端中都非常有用。

例子:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-n 120 使 read 语句在 2 分钟后超时,因此它不会阻塞cron

在终端中,它需要 2 分钟来查看rsync命令执行所需的时间。

然后后续echo就是这样后续的 bash 提示符会出现在下一行。

Enter否则,在终端中按下“继续...”后,它将直接显示在同一行。

于 2018-04-04T17:03:41.547 回答
0

我已经构建了一个小程序来pause在 Linux 中实现命令。我已将代码上传到我的 GitHub存储库

要安装它,

git clone https://github.com/savvysiddharth/pause-command.git
cd pause-command
sudo make install

安装后,您现在可以使用pause类似于在 Windows 中执行的命令。

它还支持可选的自定义字符串,例如read.

例子:

pause "Pausing execution, Human intervention required..."

使用它,使用类似语句的 C/C++ 程序system("pause");现在与 linux 兼容。

于 2022-03-05T10:32:01.040 回答
-1

试试这个:

function pause(){
   read -p "$*"
}
于 2008-09-18T14:04:32.033 回答