语境:
说我有:
(
#outer subshell
{
#inner command group, pipe-connected to ensure simultaneous invocation
do_first_thing
#die, somehow
} | {
#inner command group, pipe-connected to ensure simultaneous invocation
sleep 10
do_second_thing
}
)
echo "out"
我有一个外部子shell(不必是一个;它可以是一个命令组,也可以完全删除)。在那里面,我有两个同时被调用的管道连接的命令组。我希望两个组都开始执行,然后,当第一组完成时(第二组仍然在运行sleep
),我希望外部子shell的执行停止,即#die, somehow
行所在的位置。
问题:
我应该怎么做才能确保#die, somehow
到达该行时,#outer subshell
关卡中的所有内容都终止,但在它之后继续执行(即被out
打印)?
我试过的:
一种解决方案是使用kill 0
(杀死当前进程组中的所有内容)来退出两个内部命令组,但这种echo "out"
情况永远不会发生;整个小组都将被杀死,而不仅仅是外部子壳。
我也尝试过暂时覆盖然后unset
ingexit
函数,但这似乎只是将问题推到了另一个位置。也许我做错了;我绝不是 Bash 大师。
为什么?
在不深入细节的情况下,奇怪的 subshell 连接的命令组是必要的,因为使用&
fork out 进程在我的系统上无法确定地工作(嵌入式 *nix)。因此,管道连接的组确保如果do_first_thing
运行时间过长(在上面的示例中为 10 秒),do_second_thing
将会发生。实际用例要复杂得多,但这是问题的根源。
干杯!