仅最后一个 tee 写入文件(可能与 exec 重叠?)

仅最后一个 tee 写入文件(可能与 exec 重叠?)

我尝试将所有输出重定向到a.out,除了一些必须写入b.out。我认为在 tee 之上使用 exec(tee 也重定向到 b.out)会很好,但 tee 看起来并不总是具有相同的行为(只有最后一个似乎有效):

#!/bin/bash
exec > a.out
ls /boot |tee  b.out  #redirected to a.out only!
ls /var  |tee  b.out  #redirected to a.out only!
ls /run  |tee  b.out  #redirected to a.out only!
ls /home |tee  b.out  #redirected to a.out and b.out (good)
echo "a"              #redirected to a.out (good)

ksh 也是一样。仅供参考,ls 均不会导致错误。为什么 des tee 有时无法分叉输出?

答案1

每一个都会自行tee打开b.out并自行覆盖。最后你只能看到b.out最后一个tee(请注意,这与前一个无关exec,因此原始问题标题“tee内部exec,随机重定向行为”相当具有误导性)。

如果您检查-sb.out之间tee,您会注意到它仅包含前面的输出tee。您可以通过逐个输入命令(不重定向到a.out)并cat b.out在每个命令后调用来执行此操作。

重定向到 则a.out有所不同。当您 时execa.outshell 只会打开一次,重定向到它的所有内容都会被附加到其中。

解决方案:使用tee -a. 从man tee

-a--append
附加到给定的文件,不覆盖

相关内容