在 Linux Bash 中暂停 WinCMD 风格的规范方法是什么?

在 Linux Bash 中暂停 WinCMD 风格的规范方法是什么?

视窗Batch/CMD,要暂停脚本的执行,您可以使用

echo 'This is before pause.'
pause
echo 'The key was pressed, continuing...'

bash使用像这样的标准终端(但zsh或其他终端也应该最多工作)如何实现这一点?我当然可以编写一个简单的C应用程序,但我不敢相信,没有规范的方法 -sleep不是我正在寻找的。

我发现这些直接的方法使用:

  • read -p 'Press [Enter] key to start backup...'
  • read -p 'Press any key to resume ...'
  • read -s -n 1 -p 'Press any key to continue . . .' 在函数内部

但他们给了我XXX.sh: 4: read: arg count前两个或3: read: Illegal option -n分别。我正在使用 bash 4.4.19(1)-release

答案1

read您的命令不起作用的主要原因是它们是用于bash但您正在使用sh.

引用的文章说,

在类 Unix 操作系统上,是shellread的内置命令bash

它也是许多其他 shell 中的内置命令,包括您正在使用的 shell,但insh的语法要丰富得多。readsh

#!/bin/bash
...
read -p 'Press [Enter] key to continue: '
...

请记住使文件可执行,然后将其作为程序运行

# Assume the script is called "demo"
chmod a+x demo
./demo

答案2

简单来说,没有简单的方法来等待单个按键的按下。要求用户按 更容易Enter,因为有一种简单的方法可以等待用户输入一行。

内置read命令读取一行。您需要为其指定一个变量名称来存储该行的内容,即使您不打算使用它。

echo 'Press Enter to continue.'
read -r line
echo 'Continuing.'

#!/usr/bin/env bash如果您的脚本以或同等内容开头#!/usr/bin/env zsh,则read具有其他选项,可以让它等待单个按键。我认为不值得费心去教你的用户哪些键算作“任何键”,哪些不算作“任何键”。

请注意,在类 Unix 系统上,在无人值守且没有终端的情况下运行脚本是很常见的。典型的服务器大部分时间都没有人登录控制台。因此要求用户确认某些事情是非常罕见的。

答案3

read_a_key() (
  exec </dev/tty
  t=$(stty -g)
  trap 'stty "$t"; return' EXIT INT QUIT TERM 
  stty raw -echo isig
  dd count=1 2>/dev/null
)

printf '%s ' 'Press ANY KEY to continue ... '
key=$(read_a_key)
echo OK, continuing

使用它就好像read_a_key >/dev/null您不关心用户按下了哪个键一样。

这也应该适用于变成多个字符的键(例如F1),与 bash 不同,它会为下一个命令read -n1留下虚假OP或字符;-)[[A

答案4

您走在正确的轨道上:

read -p 'press Enter ...'

但如果您收到 arg_count 错误,则说明您使用的不是 bash,而是另一个 shell。修复:只需添加一个参数,例如:

read -p 'press Enter ...' x

现在它应该可以在你的 shell 中运行了。额外的参数可以是虚拟名称,或用于保存用户答案,例如:

echo You answered: $x

相关内容