按任意键暂停shell脚本,再按一次继续

bla*_*arg 11 shell-script

我编写了一个 shell 脚本来测试一个 API,该 API 复制文件并在每个文件之后回显其进度。

每个副本之间有两秒钟的睡眠时间,所以我想添加按任意键暂停脚本的功能,以便进行更深入的测试。然后按任意键恢复。

如何在尽可能少的行中添加它?

cha*_*aos 12

您无需在脚本中添加任何内容。外壳允许这样的功能。

  • 在终端中启动脚本。
  • 虽然正在运行并阻止终端使用ctrl- z。终端再次释放,您会看到一条消息,表明该过程已停止。(它现在处于 porcess 状态T,已停止)
  • 现在为所欲为。您还可以启动其他进程/脚本并使用ctrl-停止它们z
  • 键入jobs终端或列表中的所有已停止的作业。
  • 要让您的脚本继续运行,请键入fg(foreground)。它将作业恢复到前台进程组中,并且作业继续运行。

看一个例子:

root@host:~$ sleep 10 # sleep for 10 seconds
^Z
[1]+  Stopped                 sleep 10
root@host:~$ jobs # list all stopped jobs
[1]+  Stopped                 sleep 10
root@host:~$ fg # continue the job
sleep 10
root@host:~$ # job has finished
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您只想暂停脚本而留在脚本中,那么您可以使用 read 而不是 sleep。

您可以使用

read -t设置读取超时
read -n以读取一个字符(实际上只需按任意键)以继续脚本

由于您尚未提供任何代码,以下是如何使用它的示例。
如果按下 q 则read -n1阻止脚本继续,直到按下某个键。
当按下一个键时,检查被重置,脚本继续正常循环。

while [[ true ]]; do
    read -t2 -n1 check
    if [[ $check == "q" ]];then
        echo "pressed"
        read -n1
        check=""
    else
        echo "not pressed"
    fi
echo "Doing Something"
done
Run Code Online (Sandbox Code Playgroud)

您还可以添加stty -echo到部分的开头和stty echo结尾,以防止打字弄乱屏幕输出