强制`tee`为shell脚本中的每个命令运行?

时间:2010-10-27 19:59:27

标签: linux bash logging shell tee

我想要一个脚本,其中所有命令都是tee到日志文件。

现在我正在运行脚本中的每个命令:

<command> | tee -a $LOGFILE

有没有办法强制shell脚本中的每个命令都可以管道到tee

我无法强制用户在运行 脚本 时添加适当的tee,并且希望确保即使主叫用户没有正确记录添加自己的日志记录调用。

4 个答案:

答案 0 :(得分:15)

您可以在脚本中执行包装:

#!/bin/bash
{
echo 'hello'
some_more_commands
echo 'goodbye'
} | tee -a /path/to/logfile

修改

这是另一种方式:

#!/bin/bash
exec > >(tee -a /path/to/logfile)
echo 'hello'
some_more_commands
echo 'goodbye'

答案 1 :(得分:2)

为什么不公开一个简单的包装器:

/path/to/yourOriginalScript.sh | tee -a $LOGFILE

您的用户不应执行(甚至不知道)yourOriginalScript.sh

答案 2 :(得分:2)

假设你的脚本没有采用--tee参数,你可以这样做(如果你确实使用了那个参数,只需用你不使用的参数替换下面的--tee):< / p>

#!/bin/bash

if [ -z "$1" ] || [ "$1" != --tee ]; then
  $0 --tee "$@" | tee $LOGFILE
  exit $?
else
  shift
fi
# rest of script follows

这只是让脚本重新运行,使用特殊参数--tee来阻止无限递归,将其输出汇总到tee

答案 3 :(得分:1)

一些方法是创建跑步者脚本“run_it”,所有用户都可以调用他们自己的脚本。

run_it my_script

所有魔法都将在内部完成,例如:可能看起来像那样:

LOG_DIR=/var/log/
$@ | tee -a  $LOG_DIR/