我正在编写一个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