我试图了解exec
和tee
是如何工作的,遇到了一些我无法理解的事情:
# 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!
请帮助我了解这里发生了什么以及如何解决这个问题。
谢谢。
如果这是重复的,请关闭并提供解决方案的链接。
答案 0 :(得分:2)
这里发生的事情是tee
正在向您的文件添加内容,exec &>log.out
创建的现有打开文件指针仍然返回到该文件的开头。因此,当您开始写入该文件指针时,这些写操作始于开头,尽管其他内容已由tee
编写。
如果您想确保始终将内容添加到文件末尾,即使其他软件已修改 ,文件末尾位置 >,那么你应该确保在打开时使用O_APPEND
标志。
要执行此操作,请使用>>
而不是>
进行重定向:
exec 3>&1 4>&2 &>>${log}