【问题标题】:Better way to make a bash script self-tracing?使 bash 脚本自跟踪的更好方法?
【发布时间】:2011-01-27 06:02:23
【问题描述】:

我有某些关键的 bash 脚本被我无法控制的代码调用,而且我看不到它们的控制台输出。我想要完整跟踪这些脚本的作用,以供以后分析。为此,我想让每个脚本都进行自我跟踪。这是我目前正在做的事情:

#!/bin/bash
# if last arg is not '_worker_', relaunch with stdout and stderr
# redirected to my log file...
if [[ "$BASH_ARGV" != "_worker_" ]]; then
    $0 "$@" _worker_ >>/some_log_file 2>&1  # add tee if console output wanted
    exit $?
fi
# rest of script follows...

有没有更好、更清洁的方法来做到这一点?

【问题讨论】:

    标签: bash logging trace


    【解决方案1】:
    #!/bin/bash
    exec >>log_file 2>&1
    
    echo Hello world
    date
    

    exec 有一个关于重定向的神奇行为:“如果没有指定command,任何重定向都在当前shell中生效,返回状态为0。如果出现重定向错误,返回状态为 1。”

    另外,关于您的原始解决方案,exec "$0""$0"; exit $? 更好,因为前者在子进程退出之前不会留下额外的 shell 进程。

    【讨论】:

    • 最棒的!我只知道必须有一种更优雅的方式。谢谢,凯文;这将立即使用...
    • 它也可以输出到当前终端并记录到文件吗?我尝试将teeexec 一起使用,但没有找到任何方法..
    • 我想链接到this question,在那里可以看到输出并记录它,所有这些都是从脚本中命令的!
    【解决方案2】:

    也许您正在寻找set -x

    【讨论】:

    • @aaa:是的,我知道“set -x”——这是我在上面的“# rest of script follow...”部分偶尔使用的东西之一。我应该提到它;谢谢你这样做。
    【解决方案3】:

    您可以查看支持 bash 的通用开源跟踪库。

    当前可用的组件用于通过 bash 编写脚本,即将推出的是 Python 和 C++。接下来还有:Ruby、Java、JavaScript、SQL、PowerShell、...

    许可证是 Apache-2.0

    WKR Arno-Can Uestuensoez

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2011-10-16
      • 2018-05-15
      相关资源
      最近更新 更多