在 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+c
、virtualenv
或 pip
命令中断时,打印错误消息并执行下一个命令而不是 运行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'
我有一个带有 post_install 脚本的 deb 包,它应该创建一个 python 虚拟环境并在其上安装要求。问题是当用户按下 ctrl+c
、virtualenv
或 pip
命令中断时,打印错误消息并执行下一个命令而不是 运行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'