使用以下腳本:
#!/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
這有什么原因嗎?如何并行運行行程并同時重定向它們的輸出?
uj5u.com熱心網友回復:
這有什么原因嗎?
>(xerr)也是>(xlog)后臺行程;wait也在等他們。
如何并行運行行程并同時重定向它們的輸出?
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>&4 | xlog >&3; } 4>&1 | xerr >&3; } 3>&1
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520114.html
標籤:重击壳并行处理
上一篇:bash僅列印最后7個欄位
