如何将嵌套 bash 命令(括号内)的内部输出存储到一个文件中,并将外部输出存储到另一个文件中?

如何将嵌套 bash 命令(括号内)的内部输出存储到一个文件中,并将外部输出存储到另一个文件中?

这是我的命令:

(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.txtouter.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获取三个输出文件。

相关内容