脚本和子外壳中的陷阱信号

问题描述

我知道有很多与我的问题类似的问题,但是我没有发现任何有关在终端上发生子外壳时捕获发送的信号的问题。让我解释一下:

#!/bin/sh

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

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

fzf是用于显示列表项选择器的工具,因此当程序到达var1时 漂亮的选择器覆盖了我的终端屏幕,在一行中提示ab并在第二行中提示ab,并使用箭头键选择所需的一行,然后打印结果。使用这种方法看起来很像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)