流程替代回报提示



我正在编写一个bash脚本,并使用以下技巧将标准输出重定向到命名的管道,该管道由TEE消耗:

exec > >(tee -a $LOGFILE) 2>&1

但是,当脚本退出时,它不会返回外壳,直到我按Enter。是否有一种简单的方法可以在仍在使用此方法的同时解决此问题?

编辑:这是我正在运行的环境:

Centos 7 
Bash version 4.2.45

简单脚本的内容称为redirect.sh:

#!/bin/bash 
exec > >(tee -a /tmp/haha) 2>&1 
echo "hi there" 
exit 0

样本会话:

[root@linux-ha-1 ~]# ./redirect.sh 
[root@linux-ha-1 ~]# hi there 
[root@linux-ha-1 ~]#

提示正在打印;不幸的是,它是在打印tee的输出之前打印的(这就是为什么在示例输出中出现在hi there之前的原因)。

由于tee进程异步运行,因此无法保证它将在脚本终止之前将其输出发送到控制台。您真正想做的是关闭tee进程,然后等待它终止,然后再退出脚本。不幸的是,这不能用流程替换来完成,但是可以使用协调词(在bash 4中)或使用命名管道来完成,正如bash答案中所述:如何确保exec使用的过程替换终止?/p>

对于更简单(但不可靠)的解决方案,关闭供给tee过程的管道(将迫使其关闭),然后等待几毫秒:

#!/bin/bash
exec 3>&1 > >(tee -a /tmp/haha) 2>&1 
echo "hi there"
exec 1>&3 2>&3
sleep 0.1

相关内容

  • 没有找到相关文章

最新更新