bashで複数の子プロセスを並行で実行して終了を待つ方法(Ctrl+cでの終了に対応)

bashで複数の子プロセスを並行で実行して終了を待つには & でバックグラウンド処理しつつ wait で待つことで実現できるのですが、この方法だと Ctrl+c したときに子プロセスが残ってしまいます。

(
  command1 &
  command2 &
  wait
)

ここで、jobs -p を使えば、子プロセスのPID一覧が取得できるので、trap を使って SIGINT をトラップしたときに、jobs -p で得られたPIDを kill すれば子プロセスも kill することができます。

(
  trap 'kill $(jobs -p)' EXIT;
  command1 &
  command2 &
  wait
)

しかし、jobs -pzsh だとうまく動かないので、この場合は bash -c を使って実行する必要があります。

bash -c "
  trap 'kill \$(jobs -p)' EXIT;
  command1 &
  command2 &
  wait
"

参考