什么是Linux相当于DOS暂停?

jt.*_*jt. 229 linux bash shell

我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键.在DOS中,使用"pause"命令可以轻松完成.我可以在脚本中使用Linux等价物吗?

Jim*_*Jim 324

read 做这个:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 
Run Code Online (Sandbox Code Playgroud)

-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
Run Code Online (Sandbox Code Playgroud)

  • 严格来说,那将是"输入任何非NUL字符继续"`.有些键不发送任何字符(如`Ctrl` ...),有些键不发送(如`F1`,`Home` ...).`bash`忽略NUL字符. (5认同)
  • 如果改为使用消息“按一个键继续...”,那么即使是新手用户也可以找到“ a”键并按它; o) (3认同)
  • 通常,最好输入一个特定的键,例如回车键,空格键或Y键。“ ANY”可能会使某些用户感到困惑,因为有一个TAB键,所以为什么没有ANY键,并确保某些键具有潜在的危险例如ESCAPE,CTRL,CMD,电源按钮等。今天这已经不那么重要了,因为如今控制台通常仅由能够正确解释“ ANY key”的高级计算机用户使用。《 Apple 2设计手册》虽然很老,但是却有一个有趣的章节专门针对这一主题(https://www.apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf)。 (2认同)

y.p*_*ann 151

我使用这些非常短的方式,它们就像@theunamedguy和@Jim解决方案,但另外还有超时和静音模式.

我特别喜欢最后一种情况,并在很多脚本中使用它,直到用户按下为止Enter.

命令

说明

-r指定原始模式,不允许组合字符,如"\"或"^".

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

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

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

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

-e指定readline模式.

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

-t 5指定超时为5秒

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

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

  • +1用于解释`-s`;`man read` 和 `read --help` 帮助对 Ubuntu 10.04.1 LTS 没有帮助。编辑:`帮助阅读`做了;其余的是否已弃用? (2认同)
  • 1+ 的精彩解释:但我得到了前任的“读:-i:无效选项”。`read -rp $'您确定吗(Y/n):' -ei $'Y' key;`on #osx `read -rp $'kill-server:您确定(Y/n)吗:' -d $'Y' key;` 对我有用。` (2认同)

xsl*_*xsl 15

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


Buv*_*inJ 14

这对我有很多种Linux版本,其中一些其他解决方案没有(包括这里最流行的).我觉得它也更具可读性......

echo Press enter to continue; read dummy;
Run Code Online (Sandbox Code Playgroud)

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


mik*_*erv 9

read -n1不便携.可行的方法可能是:

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

除了使用 read,只需要按下ENTER继续提示你可以做:

sed -n q </dev/tty
Run Code Online (Sandbox Code Playgroud)

  • `status=none` 也不能移植。将 stdout 和 stderr 重定向到 /dev/null。`read -r line &lt; /dev/tty` 就足够了 _press ENTER..._。 (3认同)