在同步的内部运行异步shell命令,即等待结果

时间:2015-11-02 18:12:21

标签: shell asynchronous

我想异步运行命令,但只有在所有命令都完成后才能得到提示

例如

我想运行这样的东西 睡1&睡7&睡3&睡4个。

并在7秒后释放外壳

例如,我将使用多个卷发同时下载,并在下载所有内容时获取提示

2 个答案:

答案 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秒后回复提示