我运行了一个命令:
while true ; do ..... ....... ; done
在 Linux 控制台/终端上,现在这个 while 循环正在连续运行。
我在这里有两个问题:
- 如何跳出这个
while
循环呢? - 如果我与 Linux 的 PuTTY 会话断开连接,我如何返回并找到该循环并终止它?
答案1
答案2
有时按 control-c 不起作用:循环体得到 control-c 并且循环不断迭代。 (虽然我现在无法使用sleep 1
循环条件或主体来重现这种行为,但我记得看到过它。)
control-z 可以停止此操作,并且循环不会在之后恢复,fg
除非循环位于像 之类的子 shell 内(while true;do : ;done)
。 (在bash
GNU/Linux 上)。
fg
或者,如果您希望当前正在运行的循环迭代干净地完成,但不开始另一个迭代,则 control-z /很有用。
(Control-z 停止作业,让内核传递 SIGTSTP,就像在非原始模式的 TTY 上 control-c 传递 SIGINT 一样。此信号的默认操作是停止作业。 fg
并且bg
是作业控制命令,请参阅它们和命令的 bash 内置“帮助” jobs
。)
答案3
鉴于 @PeterCordes 正确指出的,Ctrl-C 并不总是有效,我有时使用的解决方案是避免使循环无限。相反,我经常写:
while sleep 1; do ...; done
如果一秒的延迟导致速度过慢,例如当您想要尽快循环时,则以while
信号量文件的存在为条件来调节循环:
touch /tmp/ENABLE-LOOP-FILE
while [ -f '/tmp/ENABLE-LOOP-FILE' ]; do ...; done
当您需要终止循环时,请转到另一个终端会话并删除文件:
rm /tmp/ENABLE-LOOP-FILE