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 -p は zsh だとうまく動かないので、この場合は bash -c を使って実行する必要があります。 bash -c " trap 'kill \$(jobs -p)