Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
终止由另一个bash函数调用的bash函数,而不终止调用方_Bash - Fatal编程技术网

终止由另一个bash函数调用的bash函数,而不终止调用方

终止由另一个bash函数调用的bash函数,而不终止调用方,bash,Bash,我有一个bash函数func_1,它调用func_2func_2在通过^C告知之前不会终止。如何终止func_2然后继续执行func_1?调用func_1,然后在func_2期间终止,将停止func_1。谢谢 假设func_2中的处理是通过外部程序完成的(参见下面示例中的sleep语句),您可以使用“trap”来捕获ctrl/C(实际上是SIGINT,根据@anishsane的上述注释) 请注意,外部进程的显式终止是通过将信号分派给该子进程来执行的 #! /bin/bash func_1()

我有一个bash函数
func_1
,它调用
func_2
func_2
在通过^C告知之前不会终止。如何终止
func_2
然后继续执行
func_1
?调用
func_1
,然后在
func_2
期间终止,将停止
func_1
。谢谢

假设func_2中的处理是通过外部程序完成的(参见下面示例中的sleep语句),您可以使用“trap”来捕获ctrl/C(实际上是SIGINT,根据@anishsane的上述注释)

请注意,外部进程的显式终止是通过将信号分派给该子进程来执行的

#! /bin/bash

func_1() {
        echo "In func_1"
        sleep 100 &
        # Save the PID of the external program
        X=$!
        trap 'kill -INT $X' INT
        # Wait for the external program to finish/get killed.
        wait
        echo "resume func_1"
}

func_2() {
        echo "In func_2"
        func_1
        echo "resume func_2"
}

func_2
如果您可以使用上述脚本,并输入“ctrl/C”,则输出将为:

In func_2
In func_1
^Cresume func_1
resume func_2

如果没有办法终止函数本身,那么您必须终止
func_2
trap
或周围代码执行的任何操作。如果包含实际代码,则更容易看到实际工作情况。另外,在另一个不相关的注释中,
^C
相当于
SIGINT
(即
kill-2
SIGTERM
kill-15
。bash函数与调用它们的脚本在同一进程中运行。像
^C
SIGINT
)这样的信号是在过程级传递的。因此,如果不终止父脚本,就无法终止当前函数。话虽如此,您可以
TRAP
信号设置一些全局变量,并通过检测该变量提前退出
func_2
。如果您发布
func_2
的代码,将对我们有所帮助。