在 bash 脚本中执行 virtualenv 或 pip 时 trap INT 不起作用

trap INT doesn't work when executing a virtualenv or pip in a bash script

我有一个带有 post_install 脚本的 deb 包,它应该创建一个 python 虚拟环境并在其上安装要求。问题是当用户按下 ctrl+cvirtualenvpip 命令中断时,打印错误消息并执行下一个命令而不是 运行ning 陷阱处理程序。

我试图 运行 virtualenv 在后台获取它的 PID 并等待它执行,但它没有用。 类似于:

function sig_int(){
   echo "exiting..."
   kill -SIGINT $PID
   exit 255
}

virtualenv -p python3 <somewhere> &
PID=$!
trap sig_int INT
wait $PID

脚本是这样的:

function sig_int(){
   echo "exiting..."
   # do some cleanup
   exit 255
}

trap sig_int INT

virtualenv -p python3 <somewhere>
. <somewhere>/bin/activate

pip3 install req1
pip3 install req2

read -p "> Please enter username: " user
read -s -p "> Please enter password: " pass
...

脚本从不通过按 ctrl+c 来 运行 设置陷阱功能。当 pip3 install 或 virtualenv 运行ning 按下 ctrl+c 时,只会中断 pip3 或 virtualenv,并在阅读块脚本中按下 ctrl+c 时继续执行。

我想,这是由于生成的后台作业造成的问题,您还需要将其全部杀死。我通过执行以下操作解决了类似的问题,但请注意,这也会杀死父进程。

#! /usr/bin/env bash
trap 'die' INT TERM
trap 'kill -PIPE 0' EXIT

die() {
    echo "error: $*" >&2
    exit 255
}

<cmd> || die '<cmd> failed'