按任意键暂停 shell 脚本,再按一次恢复

按任意键暂停 shell 脚本,再按一次恢复

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

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

我怎样才能在尽可能少的行中添加它?

答案1

您不需要在脚本中添加任何内容。 shell 允许这样的功能。

  • 在终端中启动脚本。
  • 当正在运行并阻止终端使用时ctrl- z。终端再次释放,您会看到一条消息,表明进程已停止。 (现在处于进程状态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

答案2

如果您只想暂停脚本,同时保留在脚本内,那么您可以使用 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

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

答案3

使用它,dd您可以可靠地从文件中读取单个字节。您stty可以设置min字节数来限定终端读取和输出time在十分之一秒内。我认为,将这两者结合起来,您可以sleep完全不用,只需让终端的读取超时为您完成工作即可:

s=$(stty -g </dev/tty)
(while stty raw -echo isig time 20 min 0;test -z "$(
dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh)
do echo "$SECONDS:" do your stuff here maybe                             
   echo  no sleep necessary, I think                                                          
   [ "$((i+=1))" -gt 10 ] && exit                                                             
done       
) </dev/tty

这是我模拟的一个小示例while循环供您尝试。每两秒,dd其尝试读取stdin(重定向自/dev/tty)就会超时,并且while循环循环。那个或者dd 因为按下某个键而超时 - 在这种情况下会调用交互式 shell。

这是一个测试运行 - 每行开头打印的数字是 shell 变量的值$SECONDS

273315: do your stuff here maybe
no sleep necessary, I think
273317: do your stuff here maybe
no sleep necessary, I think
273319: do your stuff here maybe
no sleep necessary, I think
273321: do your stuff here maybe
no sleep necessary, I think
sh-4.3$ : if you press a key you get an interactive shell
sh-4.3$ : this example loop quits after ten iterations
sh-4.3$ : or if this shell exits with a non-zero exit status
sh-4.3$ : and speaking of which, to do so you just...
sh-4.3$ exit
exit
273385: do your stuff here maybe
no sleep necessary, I think
273387: do your stuff here maybe
no sleep necessary, I think
273389: do your stuff here maybe
no sleep necessary, I think
273391: do your stuff here maybe
no sleep necessary, I think
273393: do your stuff here maybe
no sleep necessary, I think
273395: do your stuff here maybe
no sleep necessary, I think
273397: do your stuff here maybe
no sleep necessary, I think

相关内容