我知道可以使用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