使用以下脚本:
#!/bin/bash
xerr() {
sed -ue "s/^/(stderr) ${FUNCNAME[1]}: /" >&2
}
xlog() {
sed -ue "s/^/(stdout) ${FUNCNAME[1]}: /"
}
main() {
{
sleep 0.25 && echo "ok" &
sleep 1.00 && echo "ok" &
sleep 0.65 && echo "fail" >&2 &
sleep 1.00 && echo "ok" &
sleep 0.65 && echo "ok" &
wait
echo "Finished"
} 2> >(xerr) > >(xlog)
}
main
后台进程成功完成,但在wait
中永久挂起:
(stdout) main: ok
(stdout) main: ok
(stderr) main: fail
(stdout) main: ok
(stdout) main: ok
^C
然而,当(1)不重定向其输出或(2)不并行运行时,所有都按预期工作:
#(1)
main() {
{
sleep 0.25 && echo "ok"
sleep 1.00 && echo "ok"
sleep 0.65 && echo "fail" >&2
sleep 1.00 && echo "ok"
sleep 0.65 && echo "ok"
echo "Finished"
} 2> >(xerr) > >(xlog)
}
main
#(stdout) main: ok
#(stdout) main: ok
#(stderr) main: fail
#(stdout) main: ok
#(stdout) main: ok
#(stdout) main: Finished
#(2)
main() {
{
sleep 0.25 && echo "ok" &
sleep 1.00 && echo "ok" &
sleep 0.65 && echo "fail" >&2 &
sleep 1.00 && echo "ok" &
sleep 0.65 && echo "ok" &
wait
echo "Finished"
}
}
main
# ok
# fail
# ok
# ok
# ok
# Finished
这有什么原因吗?我如何并行运行进程,同时重定向它们的输出?
1条答案
按热度按时间bfnvny8b1#
这有什么原因吗?
>(xerr)
和>(xlog)
也是后台进程;wait
也在等着他们。如何并行运行进程并同时重定向其输出?