将脚本发送至其自身内的文件

将脚本发送至其自身内的文件

我熟悉使用 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
$ 

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

相关内容