这是我的命令:
(time ( \
time sleep 1; \
time sleep 2 \
) 2>&1 | tee inner.txt ) 2>&1 | tee outer.txt
cat inner.txt
显示:
real 0m1.003s
user 0m0.001s
sys 0m0.002s
real 0m2.003s
user 0m0.001s
sys 0m0.002s
并cat outer.txt
显示:
real 0m1.003s
user 0m0.001s
sys 0m0.002s
real 0m2.003s
user 0m0.001s
sys 0m0.002s
real 0m3.068s
user 0m0.005s
sys 0m0.008s
我怎样才能把这个放进去outer.txt
?:
real 0m3.068s
user 0m0.005s
sys 0m0.008s
更好的是,我怎样才能得到inner.txt
、outer.txt
、 、both.txt
、 其中both.txt
包含:
real 0m1.003s
user 0m0.001s
sys 0m0.002s
real 0m2.003s
user 0m0.001s
sys 0m0.002s
real 0m3.068s
user 0m0.005s
sys 0m0.008s
请注意,time
我上面使用的 cmd 是 bash 内置函数time
,不是该/usr/bin/time
命令是我通过此处的问题了解到的:如何将可选参数传递给time
命令
我使用的是 Linux Ubuntu 18.04。
这个问题是我在这里回答的后续问题,以便尝试改进该答案:如何在 bash 中对多行、多子命令命令进行计时,并可选择将所有输出存储到文件中
答案1
一方面,我认为你的内部tee
正在为外部提供动力,即当它tee
打印到其标准输出时,它会与外部级别上输出的任何其他内容一起重定向到外部管道。此外,在我的 Bash 上,我必须将内部括号更改为大括号才能使其正常工作(我不知道为什么)。
这似乎可以将输出输出到文件(仅):
(time {
time sleep 1;
time sleep 2;
} > inner.txt 2>&1
) > outer.txt 2>&1
为了将输出同时输出到文件和终端/脚本的标准输出,您需要将内部安排tee
为“围绕”外部输出。例如,将脚本的标准输出保存到另一个空闲文件描述符并打印到:
exec 3>&1;
(time {
time sleep 1;
time sleep 2;
} 2>&1 | tee inner.txt >&3
) 2>&1 | tee outer.txt >&3
(>&3
在外部没有必要,我只是为了对称而这样做。您也可以使用tee ... >/dev/tty
(不需要exec
)直接打印到终端,但随后重定向或管道传输整个脚本的输出将不起作用。 )
通过上述操作,您可以myscript |tee both.txt
获取三个输出文件。