我熟悉使用 tee,并且我知道我可以简单地使用
script.sh | tee file.log
但是,我希望为用户提供一个无缝界面。有没有办法在 script.sh 中运行 tee,就像上面那样?在这个脚本中,有数百个 echo 和许多其他脚本正在运行,很难将每个脚本单独附加到文件中。
答案1
解决方案 1:exec
您可以在脚本的开头放置一个 exec 命令:
$ cat script1
#!/bin/bash
exec > >(tee file.log)
echo one
echo two
以下是运行script1的示例:
$ bash script1
$ one
two
$
观察发现,在脚本输出完成之前,shell 提示符就返回了。这是因为输出进入了一个子进程,由于多任务处理的变化,它会按照自己的时间表完成。因此,我更喜欢下面显示的第二种解决方案:
解决方案 2:分组
您可以将整个脚本放在一个 shell 组中,{...}
然后从该组重定向输出:
$ cat script2
#!/bin/bash
{
echo one
echo two
} | tee file.log
这对于任意复杂的脚本都可以做到。只需将其放在{
开头和} | tee file.log
结尾即可。
示例运行如下:
$ bash script2
one
two
$
请注意,输出在提示返回之前整齐地完成。