进程替换返回提示

时间:2015-05-14 13:21:06

标签: bash exec tee

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

Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;

但是,当脚本退出时,在我按Enter键之前它不会返回shell。有没有一种简单的方法可以解决这个问题,同时仍然使用这种方法?

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

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

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

Centos 7 
Bash version 4.2.45

示例会话:

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

1 个答案:

答案 0 :(得分:1)

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

由于tee进程异步运行,因此无法保证在脚本终止之前将其输出发送到控制台。你真正想要做的是关闭tee进程,然后在退出脚本之前等待它终止。遗憾的是,这不能通过进程替换完成,但可以使用coprocesses(在bash 4中)或使用命名管道来完成,如bash: How do I ensure termination of process substitution used with exec?

的答案中所述。

对于一个更简单(但不可靠)的解决方案,关闭为tee进程提供的管道(这将迫使它关闭),然后等待几毫秒:

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