从函数中为变量分配“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
有效。但是,我想在变量中捕获 function
的 output
:
sleep 5 &
spid=$!
spid_status=$(waitpid $spid)
echo $?
255
[1]+ Done sleep 5
这不起作用,因为 $()
启动一个新的 subshell
,并且 wait
无法等待不是它自己的子级的 shell。
有解决办法吗?我想要一个 wait
s 等待 subshell
s 完成并且 return
s 所有退出状态的函数,如下所示:
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=$?
我有一个 function
wait
给定的 pids
:
waitpid() {
wait "$@";
}
我可以这样 wait
job
:
sleep 5 &
spid=$!
waitpid $spid
echo $?
0
有效。但是,我想在变量中捕获 function
的 output
:
sleep 5 &
spid=$!
spid_status=$(waitpid $spid)
echo $?
255
[1]+ Done sleep 5
这不起作用,因为 $()
启动一个新的 subshell
,并且 wait
无法等待不是它自己的子级的 shell。
有解决办法吗?我想要一个 wait
s 等待 subshell
s 完成并且 return
s 所有退出状态的函数,如下所示:
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=$?