![按任意键暂停 shell 脚本,再按一次恢复](https://linux22.com/image/34167/%E6%8C%89%E4%BB%BB%E6%84%8F%E9%94%AE%E6%9A%82%E5%81%9C%20shell%20%E8%84%9A%E6%9C%AC%EF%BC%8C%E5%86%8D%E6%8C%89%E4%B8%80%E6%AC%A1%E6%81%A2%E5%A4%8D.png)
我编写了一个 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