在脚本和子 shell 中捕获信号

Trap signals both in script and subshells

我知道有很多类似我的问题,但我没有发现任何关于在终端上发生子shell时发送的陷阱信号。让我解释一下:

#!/bin/sh

trap 'echo "exiting.."; exit 0;' INT

var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)

fzf 是一个显示列表项的 selector 的工具,所以当程序到达 var1 a 漂亮 selector 覆盖我的终端屏幕,第一行提示 ab,第二行提示 ab,使用箭头键我 select 所需的屏幕,然后打印结果。看起来很像 dmenu 使用这种方式。

问题是当 fzf 提示这些行时,Ctrl-C 不会被脚本捕获。相反,Ctrl-C 会杀死 fzf 但脚本会保留 运行.
所以这里的问题更多的是关于如何将这个信号传播给父进程。

没有简单的方法将特定信号从子级传播到父级。 但是,如果程序在许多情况下由 Ctrl-C 终止,则退出代码为 130fzf 也跟随它。 检查退出状态并向自己的进程发送信号是解决方法之一。

#!/bin/sh
trap 'echo "exiting.."; exit 0;' INT

var1=$(echo "ab\nab" | fzf)
[ $? -eq 130 ] && kill -INT $$
var2=$(echo "cd\ncd" | fzf)
[ $? -eq 130 ] && kill -INT $$

然而,这不是常见的方式。 如果它在因任何错误而终止时需要做一些事情,使用 set -e 并捕获 EXIT 或其他信号是通用的方法。

#!/bin/sh
set -e
trap 'echo "exiting.."; exit 0;' EXIT

var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)