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