如何在终端中停止循环 bash 脚本?

如何在终端中停止循环 bash 脚本?

例如,

#!/bin/bash
while :
do
    sl
done

如何终止这个 bash 脚本?

答案1

  1. Ctrl-Z暂停脚本
  2. kill %%

告诉%%bash 内置函数kill您想要将信号(默认为 SIGTERM)发送到当前 shell 中最近挂起的后台作业,而不是进程 ID。

您还可以按编号或名称指定作业。例如,当您使用 ^Z 暂停作业时,bash 会使用类似 的内容告诉您其作业编号[n]+ Stopped,其中方n括号内是作业编号。

有关作业控制和终止作业的更多信息,请在 bash 中运行help jobshelp fghelp bghelp kill,然后搜索JOB CONTROL(全部大写)或jobspec在 bash 手册页中。

例如

$ ./killme.sh
./killme.sh:第 4 行:sl:找不到命令
./killme.sh:第 4 行:sl:找不到命令
./killme.sh:第 4 行:sl:找不到命令
./killme.sh:第 4 行:sl:找不到命令
./killme.sh:第 4 行:sl:找不到命令
...
...
...
./killme.sh:第 4 行:sl:找不到命令
^Z
[1]+ 已停止./killme.sh
$杀死%%
$
[1]+ 终止./killme.sh

在此示例中,作业编号为 1,因此其kill %1工作方式与kill %%

(注意:我没有sl安装,所以输出只是“未找到命令”。在您的情况下,您将得到 sl 产生的任何输出。这并不重要 - 挂起^Zkill %%将工作相同)

答案2

该程序sl故意忽略SIGINT,这是当您按 时发送的内容Ctrl+C。因此,首先,您需要通过添加参数来告诉sl不要忽略。SIGINT-e

如果你尝试这样做,你会发现你可以阻止每个人sl,但他们仍然重复。您还需要告诉bash退出之后。SIGINT您可以通过trap "exit" INT在循环之前放置 a 来完成此操作。

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done

答案3

如果您希望 ctrl+c 停止循环,但不终止脚本,您可以将其放在|| break正在运行的任何命令之后。只要您运行的程序通过 ctrl+c 终止,就可以正常工作。

#!/bin/bash
while :
do
    # ctrl+c terminates sl, but not the shell script
    sl -e || break
done

如果您处于嵌套循环中,则可以使用“break 2”退出两层,等等。

答案4

您可以通过从启动此脚本的终端按 Ctrl+C 来终止该脚本。当然,此脚本必须在前台运行,以便您可以通过 Ctrl+C 停止它。

或者您可以通过以下方式在其他打开的终端中找到该脚本的 PID(进程 ID):

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

两种方法都应该能够满足您的要求。

相关内容