不要用kill -9.
你想陷阱EXIT,而不是INT.
trap 'kill $fooPid $barPid' EXIT
foo & fooPid=$!
bar & barPid=$!
wait
Run Code Online (Sandbox Code Playgroud)
该解决方案将始终确保终止,foo并且bar无论其退出的原因(不包括它被SIGKILL编辑).
如果你想避免保留PID(有一些竞争条件问题),你可以这样做:
trap 'kill $(jobs -p)' EXIT
foo &
bar &
wait
Run Code Online (Sandbox Code Playgroud)
如果你的脚本没有其他工作,这是一个更好(更清洁!)的解决方案.
PS:这些解决方案意味着foo并bar可以写入到终端(你的脚本stdout),但也可以读取stdin.如果你需要或者foo还是bar从标准输入读取,溶液变成一个有点复杂.