我尝试将所有输出重定向到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
有所不同。当您 时exec
,a.out
shell 只会打开一次,重定向到它的所有内容都会被附加到其中。
解决方案:使用tee -a
. 从man tee
:
-a
,--append
附加到给定的文件,不覆盖