当前位置:首页> 正文

关于bash:与DOS暂停等效的Linux是什么?

关于bash:与DOS暂停等效的Linux是什么?

What is the Linux equivalent to DOS pause?

我有一个Bash shell脚本,我想在其中暂停执行,直到用户按下某个键为止。 在DOS中,可以使用" pause"命令轻松完成此操作。 我可以在脚本中使用等效的Linux吗?


read这样做:

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

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

如果使用的是Bash,则还可以使用-t指定超时,这将导致在未按下键时read返回失败。因此,例如:

1
2
3
4
5
6
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解决方案一样,但是还有超时和静默模式。

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

指令

  • 输入解决方案

    1
    2
    read -rsp $'Press enter to continue...
    '
  • 转义解决方案(带有-d $' e')

    1
    2
    read -rsp $'Press escape to continue...
    '
    -d $'\e'
  • 任何关键解决方案(带有-n 1)

    1
    2
    3
    read -rsp $'Press any key to continue...
    '
    -n 1 key
    # echo $key
  • 具有预选选项的问题(带有-ei $'Y')

    1
    2
    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
  • 超时解决方案(带有-t 5)

    1
    2
    read -rsp $'Press any key or wait 5 seconds to continue...
    '
    -n 1 -t 5;
  • 睡眠增强别名

    1
    2
    read -rst 0.5; timeout=$?
    # echo $timeout

说明

-r指定原始模式,该模式不允许使用诸如""或" ^"之类的组合字符。

-s指定静默模式,并且因为我们不需要键盘输出。

-p $'prompt'指定提示,提示必须在$'和'之间,以允许空格和转义字符。注意,必须在单引号之间加上美元符号以使转义字符受益,否则可以使用简单的引号。

-d $' e'指定escappe作为分隔符,因此,作为当前输入的最后一个字符,可以放置任何字符,但请小心放置用户可以键入的字符。

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

-e指定读取行模式。

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

-t 5指定5秒的超时

如果您需要知道输入,则在-n1情况下使用按键服务。

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


这对我来说适用于多种版本的Linux,而其他一些解决方案则没有(包括此处最受欢迎的解决方案)。我认为它也更具可读性...

1
echo Press enter to continue; read dummy;

请注意,需要提供变量作为read的参数。


没有任何参数的read仅在您按Enter键时才会继续。
如果您按任意键,DOS pause命令将继续。如果需要此行为,请使用read –n1


read -n1不可移植。一种可移植的方法可以是:

1
2
3
(   trap"stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

除了使用read,只需按ENTER继续提示,您可以执行以下操作:

1
sed -n q </dev/tty

如果只需要暂停循环或脚本,并且很高兴按Enter键而不是任何键,那么read本身就可以完成任务。

1
2
3
do_stuff
read
do_more_stuff

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


此功能在bashzsh中均有效,并确保对终端的I / O:

1
2
3
4
5
6
7
8
9
# 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 '
'

}
export_function pause

把它放在您的.{ba,z}shrc中,以求正义!


尝试这个:

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

是的,对于使用read-进行了一些调整,使其在cron和终端中最有用。

例:

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

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

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

然后,后面的echo是,因此后面的bash提示将出现在下一行。

否则,在终端中按Enter时,它将在" continue ..."之后直接在同一行上显示。


展开全文阅读

相关内容