Tee 脚本以在其自身内归档

Bry*_*son 6 bash tee

我熟悉使用 tee,我知道我可以简单地记录输出

script.sh | tee file.log
Run Code Online (Sandbox Code Playgroud)

但是,我想要一个无缝的用户界面。有没有办法在 script.sh 中像上面那样运行 tee ?在这个脚本中,有数百个回声和许多其他正在运行的脚本,很难将每个脚本单独附加到文件中。

Joh*_*024 9

解决方案1:执行

您可以在脚本的开头放置一个 exec 命令:

$ cat script1
#!/bin/bash
exec > >(tee file.log)
echo one
echo two
Run Code Online (Sandbox Code Playgroud)

以下是运行 script1 的示例:

$ bash script1
$ one
two

$
Run Code Online (Sandbox Code Playgroud)

观察在脚本输出完成之前返回的 shell 提示。这是因为输出进入一个子进程,并且由于多任务处理的变化无常,它按自己的时间表完成。出于这个原因,我更喜欢下面显示的第二种解决方案:

解决方案2:分组

您可以将整个脚本放在一个 shell 组中,{...}然后重定向该组的输出:

$ cat script2
#!/bin/bash
{
echo one
echo two
} | tee file.log
Run Code Online (Sandbox Code Playgroud)

这可以为任意复杂的脚本完成。放在{开头和} | tee file.log结尾。

示例运行如下所示:

$ bash script2
one
two
$ 
Run Code Online (Sandbox Code Playgroud)

请注意,输出在提示返回之前整齐地完成。