【问题标题】:redirect all output in a bash script when using set -x使用 set -x 时重定向 bash 脚本中的所有输出
【发布时间】:2012-06-29 01:44:31
【问题描述】:

我有一个 bash 脚本,其中包含 set -x。是否可以将此脚本的调试打印及其所有输出重定向到文件?理想情况下,我想做这样的事情:

#!/bin/bash
set -x
(some magic command here...) > /tmp/mylog
echo "test"

然后得到

+ echo test
test

在 /tmp/mylog 中输出,而不是在标准输出中。

【问题讨论】:

  • this question。它不是重复的,但我相信这应该回答你的问题。

标签: bash io-redirection


【解决方案1】:

这是我刚刚用谷歌搜索的,我记得我前段时间用过这个......

使用 exec 重定向脚本中所有命令的标准输出和标准错误:

#!/bin/bash
logfile=$$.log
exec > $logfile 2>&1

更多重定向魔法请查看Advanced Bash Scripting Guide - I/O Redirection

如果您还想在日志文件中添加查看终端上的输出和调试,请参阅redirect COPY of stdout to log file from within bash script itself

如果您想独立于正常的STDOUTSTDERR 处理set -x 跟踪输出的目标,请参阅bash storing the output of set -x to log file

【讨论】:

  • 有趣。我如何使用此方法将错误(stdout 2)捕获到日志文件中并将它们返回到 stdout 2;所以 cron 可以正确地通过电子邮件发送错误警报?
  • @JoeyT,看看这是否适合你:在使用exec 3<&1 设置日志文件之前备份STDOUT,然后在末尾添加这两行:exec 1<&3 3<&-cat $$.log - 这个应该恢复 STDOUT 并关闭 fd 3 进行清理。基于原始tldp 参考和此http://tldp.org/LDP/abs/html/ioredirintro.html
  • @JoeyT 我已经编辑了答案并添加了另外两个有用的链接;第一个应该足以解释如何做到这一点。
【解决方案2】:

-x 输出到 stderr,所以要记录它:

set -x
exec 2>/tmp/mylog

【讨论】:

    【解决方案3】:

    在我的例子中,脚本从其他地方被多次调用,我没有看到所有内容,所以我做了一个追加,它起作用了:

    exec 1>>FILENAME 2>&1
    set -x
    

    为避免混淆,请务必在每次运行前删除 FILENAME。

    【讨论】:

      【解决方案4】:

      重定向stderrstdout

      exec &>> $LOG_FILE_NAME
      

      如果你想追加到文件。覆盖文件:

      exec &> $LOG_FILE_NAME
      

      【讨论】:

        猜你喜欢
        • 2014-09-22
        • 2014-11-17
        • 1970-01-01
        • 2012-09-29
        • 2020-03-22
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多