Eu descobri depois de ler isto:
A solução é fazer set -m
no início do script.
Isso faz com que o bash crie um novo grupo de processos para cada processo,
não fazendo com que o SIGINT seja enviado para todos os processos no script.
Para referência, o script fixo se parece com isto:
#!/usr/bin/env bash
set -m
set -e
service_name=xxx
for dir in ../1 ../2 ../3; do
if [ ! -d "$dir" ]; then
echo "docker compose requires $dir, please check $dir do exist in the same folder level"
exit 0
fi
done
TEMP_LOG_FILE=$(mktemp --suffix '-dev-env-log')
(trap '' SIGINT && docker-compose up --build > ${TEMP_LOG_FILE}) &
less +F -r ${TEMP_LOG_FILE}
rm ${TEMP_LOG_FILE}
echo "Less was quit, stopping containers..."
if [ ! $? -eq 0 ]; then
echo "could not start service or Control-C was pressed"
echo "cleaning up"
docker-compose down
exit $?
fi
docker-compose down
docker-compose rm --all --force