终端击键/组合可跳过 shell 脚本执行中的当前段落

终端击键/组合可跳过 shell 脚本执行中的当前段落

我经常在 debian 和 Linux 中运行 bash 脚本。

我们都知道 CTRL + C 组合键可以中断当前程序并关闭可执行文件/脚本,但此击键完全终止批处理/脚本。

我正在寻找的是击键仅跳过(如嵌套的 CTRL +C)仅针对非常实际的段落即使不执行该段落会导致出现错误的情况,就像 for 循环中的“break”和“continue”所做的那样。

示例脚本:

演示文件

wget http://something_from_the_internet...
unzip that_file
ping my_host
4th passage...
5th passage...

我想按组合键跳到第 2 个命令(在本例中为解压缩),或者按两次并直接转到第 3 个命令(在本例中为 ping...)。

在许多情况下,脚本文件的结果是由所有段落给出的..但在我的情况下并非如此,出于测试目的,具有这样的组合将允许我运行和测试内容,而无需注释所有行顶部只是为了快速查看底部的最新信息。

答案1

您无法使用 bash“跳过”正在运行的进程。根据从 bash 文档的页面来看,即使它对信号有跳过行为,它也会等到进程完成执行才能发出跳过,从而有效地仅跳过以下指令。不过,您可以更改脚本的运行方式,以便它在后台运行时为您终止解压缩进程,例如在收到 SIGINT 时(指导)。

答案2

您可以选择SIGINT使用 Bash 的内置函数捕获信号trap

trap [COMMANDS] [SIGNALS]

例如,您可以捕获SIGINT发送到前台脚本的信号,以将信号发送到从脚本派生的进程。

然而,在这种情况下,您将需要分叉进程的 PID。您可以使用 Bash 的$!变量,但它仅适用于分叉到后台的进程。

作为解决方法,为了保持脚本的同步性质,您可以显式调用wait返回的 PID。

#!/usr/bin/env bash

function skip() {
  kill -SIGTERM $!
}

trap skip SIGINT

ping ... &
wait $!

wget ... &
wait $!

unzip ... &
wait $!

相关内容