如何在脚本中记录shell脚本输出

时间:2013-10-09 13:58:51

标签: shell ksh output-redirect

我有一个ksh93脚本(但问题与ksh无关)。

目前,我运行的脚本类似于:

./script 2>&1 | tee logfile

我想知道我的脚本应该具有什么才能获得完全相同的结果(屏幕输出和包含STDOUT和STDERR输出的日志文件)。 当然,我想避免添加'|我做的每个回声/打印的tee logfile'。

当然,一种方法可以将我的脚本包装在另一个只运行'./script 2>& 1 |的脚本中。 tee logfile'但我想知道这是否可以在脚本本身内完成。

3 个答案:

答案 0 :(得分:3)

如果脚本的当前内容是:

command1 arg1
command2 arg2

您可以像这样包装该批次(在脚本中):

{
command1 arg1
command2 arg2
} 2>&1 | tee logfile

{}代码现在是脚本中I / O重定向的一个单元;最后的I / O重定向适用于所有封闭的命令。它不会创建子shell;在I / O重定向之后,脚本可以使用命令中设置的任何变量。

{}在语法上略显特殊;特别是,}必须以分号或换行符开头。

答案 1 :(得分:2)

一种有点脆弱的常见技术是:

#!/bin/sh
test -z "$NOEXEC" && { NOEXEC=1 exec "$0" "$@" 2>&1 | tee logfile; exit; }
...

这将丢弃返回值并退出tee返回的值。这可能是也可能不是问题,可能是期望的行为。

答案 2 :(得分:0)

只需将代码放入函数中并调用它即可。

your_func(){
#your code
}
your_func $@ 2>&1 | tee logfile