Linux中DOS暂停的等价是什么?

我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键。在DOS中,这可以通过pause命令轻松完成。在我的脚本中是否有一个Linux等效程序?

190180 次浏览

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

试试这个:

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

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

我经常使用这些非常简短的方法,它们就像@theunamedguy和@Jim解决方案,但除此之外还有暂停和沉默模式。< / p >

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

命令

  • < p > 输入解决方案

    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
    

Explanation

-r specifies raw mode, which don't allow combined characters like "\" or "^".

-s specifies silent mode, and because we don't need keyboard output.

-p $'prompt' specifies the prompt, which need to be between $' and ' to let spaces and escaped characters. Be careful, you must put between single quotes with dollars symbol to benefit escaped characters, otherwise you can use simple quotes.

-d $'\e' specifies escappe as delimiter charater, so as a final character for current entry, this is possible to put any character but be careful to put a character that the user can type.

-n 1 specifies that it only needs a single character.

-e specifies readline mode.

-i $'Y' specifies Y as initial text in readline mode.

-t 5 specifies a timeout of 5 seconds

key serve in case you need to know the input, in -n1 case, the key that has been pressed.

$? serve to know the exit code of the last program, for read, 142 in case of timeout, 0 correct input. Put $? in a variable as soon as possible if you need to test it after somes commands, because all commands would rewrite $?

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

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

do_stuff
read
do_more_stuff

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

这在多种Linux版本上都适用,而其他一些解决方案(包括这里最受欢迎的解决方案)则不适用。我认为它也更有可读性…

echo Press enter to continue; read dummy;

注意,一个变量需要作为参数提供给read

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

例子:

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

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

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

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

否则,当在终端中按下输入时,它将直接显示在“continue…”之后的同一行。

这个函数在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 for Great Justice!

这样,按下除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

我已经构建了一个小程序来实现Linux中的pause命令。我已经在我的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..."

使用这一点,使用system("pause");这样语句的C/ c++程序现在与linux兼容。