什么是Linux相当于DOS暂停?

时间:2008-09-18 14:02:28

标签: linux bash shell

我有一个Bash shell脚本,我希望在用户按下某个键之前暂停执行。在DOS中,使用“pause”命令可以轻松完成。我可以在我的脚本中使用Linux等价物吗?

9 个答案:

答案 0 :(得分:312)

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

答案 1 :(得分:146)

我使用这些非常短的方式,它们就像@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 $'提示'指定提示,该提示需要在$'和'之间,以允许空格和转义字符。要小心,你必须在带有美元符号的单引号之间加入转义字符,否则你可以使用简单的引号。

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

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

-e 指定readline模式。

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

-t 5 指定超时为5秒

用于您需要知道输入的情况,在-n1情况下,已按下的键。

$?用于了解最后一个程序的退出代码,用于读取,142在超时情况下,0正确输入。投入$?如果你需要在某些命令之后测试它,请尽快在变量中,因为所有命令都会重写$?

答案 2 :(得分:14)

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

echo Press enter to continue; read dummy;

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

答案 3 :(得分:13)

没有任何参数的

read只有在按Enter键时才会继续。 如果按任意键,DOS pause命令将继续。如果您想要这种行为,请使用read –n1

答案 4 :(得分:8)

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

答案 5 :(得分:2)

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

do_stuff
read
do_more_stuff

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

答案 6 :(得分:1)

此功能在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中以求大法官!

答案 7 :(得分:0)

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

示例:

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

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

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

然后随后的echo是后续的bash提示符将显示在下一行。

否则它会在&#34;继续...&#34;之后直接显示在同一行。在终端按 Enter 时。

答案 8 :(得分:-1)

试试这个:

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