1

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

目前,我使用以下内容运行我的脚本:

./script 2>&1 | tee logfile

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

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

4

3 回答 3

4

如果脚本的当前内容是:

command1 arg1
command2 arg2

您可以像这样包装很多(在脚本内):

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

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

{and在}句法上有些特殊;特别是,}必须以分号或换行符开头。

于 2013-10-09T15:04:44.077 回答
3

一种比较脆弱的常用技术是:

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

这将丢弃返回值并以返回的值退出tee。这可能是也可能不是问题,并且可能是所需的行为。

于 2013-10-09T14:10:28.097 回答
0

只需将您的代码放在一个函数中并调用它。

your_func(){
#your code
}
your_func $@ 2>&1 | tee logfile
于 2013-10-09T14:14:41.427 回答