在Bash Shell脚本中使用tee覆盖了文件输出

时间:2017-03-30 22:32:06

标签: bash shell

我试图了解exectee是如何工作的,遇到了一些我无法理解的事情:

# create a log.out file in current directory
log=$(echo $(pwd)/log.out)

# start redirect
# 3 holds stdout, 4 holds stderr
# 1 & 2 points to log.out
exec 3>&1 4>&2 &>${log}

# print 'Have a good day everyone!' to both log.out and stdout 
echo 'Have a good day everyone!' | tee ${log} 1>&3
echo 'Ciao!'
echo 'Bye!'

# end redirect
exec 1>&3 2>&4 3>&- 4>&-

当我进入log.out文件时,我得到了这个:

Ciao!                                                                                                                                                 
Bye!                                                                                                                                                  
 day everyone!

我在期待:

Have a good day everyone!
Ciao!
Bye!

请帮助我了解这里发生了什么以及如何解决这个问题。

谢谢。

如果这是重复的,请关闭并提供解决方案的链接。

1 个答案:

答案 0 :(得分:2)

这里发生的事情是tee正在向您的文件添加内容,exec &>log.out创建的现有打开文件指针仍然返回到该文件的开头。因此,当您开始写入该文件指针时,这些写操作始于开头,尽管其他内容已由tee编写。

如果您想确保始终将内容添加到文件末尾,即使其他软件已修改 ,文件末尾位置 >,那么你应该确保在打开时使用O_APPEND标志。

要执行此操作,请使用>>而不是>进行重定向:

exec 3>&1 4>&2 &>>${log}