【问题标题】:How to log a shell script output within the script如何在脚本中记录 shell 脚本输出
【发布时间】:2013-10-16 22:33:53
【问题描述】:

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

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

./script 2>&1 | tee logfile

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

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

【问题讨论】:

    标签: shell ksh output-redirect


    【解决方案1】:

    如果你的脚本的当前内容是:

    command1 arg1
    command2 arg2
    

    你可以像这样包装很多(在脚本中):

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

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

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

    【讨论】:

    • 您的解决方案似乎比威廉的解决方案更“干净”,但与我的脚本一起使用时,它无需完成所有工作即可返回。奇怪,不知道为什么,暂时没有时间调查。我在远程机器上通过 ssh 运行了很多命令,这些命令不在括号内执行(使用 ksh93)。
    • 奇怪——我不知道为什么会这样。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您能评论一下exit 的必要性吗?无论tee的退出状态如何,似乎都会使脚本始终以状态0退出。
    • 没关系,需要exit 来防止脚本运行两次。但也许exit $? 是必要的。
    • exit 不带参数与exit $? 相同
    • sigh 我的错;我以为它默认为 0。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2014-07-08
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2013-01-31
      • 2010-09-23
      相关资源
      最近更新 更多