首页 > 解决方案 > tee 挂在 bash 中——是否有替代语法?

问题描述

假设您有一系列不属于您的脚本,因此无法修改,它们可能会在不重定向 stdout 和 stderr 的情况下生成后台进程。我注意到在 bash 中,如以下示例所示,如果后台进程仍在运行(并且具有标准输出或标准错误的打开文件描述符),则在脚本完成时不会返回输出。

./runme.sh 2>&1| tee runme.out

其中runme.sh定义为:

#!/bin/bash
# Start a fake daemon
perl -e 'while(1) { sleep(1) }' &
printf "Enter your name: "
read name
echo "Goodbye $name"

如何在 bash 中运行这样的脚本,同时捕获所有输出并在脚本完成后返回提示?

标签: bashdaemontee

解决方案


替代语法可能是使用进程替换

./runme.sh > >(tee runme.out) 2>&1

这种方式tee不再是当前 shell 的子进程,shell 将只等待runme.sh终止,而在管道中它正在等待所有进程终止。

请注意,和子进程在终止tee后仍在运行。runme.sh


推荐阅读