在 shell 脚本中,我正在启动一个长时间运行的后台进程。初始化后,该进程会写入许多行输出。在我的 shell 脚本中,我想仅在此进程初始化后(并因此开始写入输出)继续执行后续命令。
我起草了一个 shell 函数来执行此操作,但它没有像我希望的那样工作。
daemonize() {
fifo=`basename $0`.$$
mkfifo $fifo
$* >$fifo &
( head -1; cat & ) <$fifo
rm $fifo
}
daemonize yes
sleep 3 && kill $! && wait
我希望脚本能够输出很多行 yes 输出(持续三秒钟);但是,我得到一行输出。看来当子shell退出时,cat被杀死了。
有没有办法在 shell 中做我希望做的事情?我非常确定,在读取一行输出后,带有 fork 的单个 C 程序将完全按照我的希望进行。
从 ash 和 pdksh 派生的 shell 不会使管道的读取端在
head
和 cat
之间保持打开状态,您需要自己这样做。此外,管道不可查找,您将丢失数据 head
。
而不是
( head -1; cat & ) <$fifo
rm $fifo
做
exec 3<"$fifo"
rm "$fifo"
IFS= read -r line <&3
printf '%s\n' "$line"
cat <&3 &
exec 3<&-
它适用于大多数 shell。