什么是Linux相当于DOS暂停?

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

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 

我使用这些很短的方法,他们就像@theunamedguy和@Jim的解决scheme,但另外还有超时和静音模式。

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

命令

  • input解决scheme

     read -rsp $'Press enter to continue...\n' 
  • 逃生解决scheme (带-d $'\ e')

     read -rsp $'Press escape to continue...\n' -d $'\e' 
  • 任何关键解决scheme (使用-n 1)

     read -rsp $'Press any key to continue...\n' -n 1 key # echo $key 
  • 预先select的问题 (带-ei $'Y')

     read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; # echo $key 
  • 超时解决scheme (带-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 '指定escappe作为分隔符,因此作为当前条目的最后一个字符,可以放置任何字符,但要小心地放置用户可以键入的字符。

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

-e指定readline模式。

-i $' Y '在读线模式下将Y指定为初始文本。

-t 5指定了5秒的超时时间

在需要知道input的情况下键入,在-n1的情况下,已经按下的键。

$? 用来知道最后一个程序的退出代码,用于读取,142在超时的情况下,0正确的input。 把$? 在一个variables中,如果你需要在某些命令后testing它,所有的命令都会重写$?

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

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 -nq </dev/tty 

这对我来说在多种Linux上都有效,其中一些其他解决scheme没有(包括这里最stream行的解决scheme)。 我觉得它也更可读

 echo Press enter to continue; read dummy; 

请注意,需要提供一个variables作为参数来read

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

尝试这个:

 function pause(){ read -p "$*" }