从函数中为变量分配“wait”命令的退出状态

Assigning a variable the exit status of `wait` command from a function

我有一个 function wait 给定的 pids:

waitpid() { 
  wait "$@";
}

我可以这样 wait job

sleep 5 &
spid=$!
waitpid $spid
echo $?
0

有效。但是,我想在变量中捕获 functionoutput

sleep 5 &
spid=$!
spid_status=$(waitpid $spid)
echo $?
255
[1]+  Done                    sleep 5

这不起作用,因为 $() 启动一个新的 subshell,并且 wait 无法等待不是它自己的子级的 shell。

有解决办法吗?我想要一个 waits 等待 subshells 完成并且 returns 所有退出状态的函数,如下所示:

waitpids() { 
  local pids_status
  for pid in "$@"; do
    wait "$pid";
    pids_status+=($?)
  done
  echo "$pids_status[@]}"
}

要避免创建子外壳,您必须改用重定向。最简单的可能是创建一个临时文件来保存数据:

trap 'rm -f "$stdout"' EXIT # Optional
stdout="$(mktemp)"
waitpid > "$stdout"
spid_status=$?