Bash函数正在等待其子进程完成

时间:2015-03-25 12:52:36

标签: bash

在不等待其子进程结束的情况下获取bash函数输出的最佳方法是什么?例如,以下操作不起作用,因为直到sleep 10&子进程结束后才返回bash。

test-fn() {
    sleep 10&
    echo $!
}

pid=$(test-fn)
echo "waiting"
wait $pid

在test-fn函数中移动echo不是一个选项:在我的实际情况中,子进程永远不会结束,所以函数永远不会返回。

1 个答案:

答案 0 :(得分:1)

问题是进程替换正在等待与函数调用的stdout关联的管道的所有写端被关闭,但是睡眠的一端打开。如此接近它:

test_fn() {
    sleep 10 >&- &  # close stdout for sleep, or redirect if desired
    echo $!
}

pid=$(test_fn)
echo "waiting"
wait

请注意,顶级shell无法等待$ pid,因为pid不是该shell的子级。