准备 shell 脚本以输出到文件和控制台

准备 shell 脚本以输出到文件和控制台

我知道可以使用tee将输出内容复制到文件并仍然将其输出到控制台。

但是,我似乎找不到一种方法来准备 shell 脚本(如固定模板)而不使用tee脚本中的每个命令或使用管道来执行脚本tee

因此,我必须每次都开始使用管道调用脚本,tee而不是通过脚本自动为我执行此操作。

我尝试使用经过修改的 shebang 使用管道,但没有成功,而且我似乎找不到实现此目的的方法。

因此,不要像这样调用脚本:

./myscript.sh |& tee scriptout.txt

我想通过这样调用它来达到相同的效果:

./myscript

当然,脚本需要知道脚本内变量中设置的文件名。

我怎样才能做到这一点?

答案1

您可以将脚本的内容包装在函数中,并将函数输出通过管道传输到tee

#!/bin/bash

{
echo "example script"
} | tee -a /logfile.txt

答案2

您可能可以执行一些操作,例如使用在脚本开头设置输出exec。 (我还没有对此进行过强有力的测试。)

#!/bin/bash

# Split script output to stdout and to the logfile
exec 1> >(tee -a "/tmp/${0##*/}.log")

# Write a message
echo hello, world

# Empirical pause before exiting to wait for all output to get through the tee
sleep 1
exit 0

例如,假设脚本被调用demo并且已通过以下命令使其可执行chmod a+x demo

ls -l /tmp/demo.log
ls: cannot access '/tmp/demo.log': No such file or directory

./demo
hello, world

cat /tmp/demo.log
hello, world

相关内容