我想异步运行命令,但只有在所有命令都完成后才能得到提示
例如
我想运行这样的东西 睡1&睡7&睡3&睡4个。
并在7秒后释放外壳
例如,我将使用多个卷发同时下载,并在下载所有内容时获取提示
答案 0 :(得分:1)
传统方法是收集PID并依次等待它们;这意味着您知道命令的退出状态以及它们中的任何一个是否失败。
#!/bin/bash
# ^^- important: the below uses bash/ksh extensions not available in /bin/sh
pids=( )
sleep 1 & pids+=( $! )
sleep 6 & pids+=( $! )
sleep 3 & pids+=( $! )
sleep 4 & pids+=( $! )
num_failures=0
for pid in "${pids[@]}"; do
wait "$pid" || (( ++num_failures ))
done
if (( num_failures > 0 )); then
echo "Warning: $num_failures background processes (out of ${#pids[@]} total) failed" >&2
fi
如果您需要与/bin/sh
兼容,那么这会有所改变:
#!/bin/sh
pids=''
sleep 1 & pids="$pids $!"
sleep 6 & pids="$pids $!"
sleep 3 & pids="$pids $!"
sleep 4 & pids="$pids $!"
num_failures=0
for pid in $pids; do
wait "$pid" || num_failures=$(( num_failures + 1 ))
done
if [ "$num_failures" -gt 0 ]; then
echo "Warning: $num_failures background processes failed" >&2
fi
...或者,如果足以等待所有后台工作,而没有详细状态的哪一个失败:
sleep 1 & sleep 6 & sleep 3 & sleep 4 &
wait
答案 1 :(得分:-1)
好的发现了
将它们包装在$()中可以解决问题
例如
时间$(睡眠1&睡眠7&睡眠3&睡眠4)确实在7秒后回复提示