bash:将-x日志设置为文件


18

我有一个shell脚本,set -x具有详细/调试输出:

#!/bin/bash

set -x
command1
command2
...

输出看起来像这样:

+ command1
whatever output from command1
+ command2
whatever output from command2

我的问题是,外壳输出(由set -x)前往stderr,用命令的输出(混合command1command2...)。我很乐意在屏幕上显示“正常”输出(例如脚本woud在不使用的情况下运行set -x)和bash的“额外”输出分别存储在一个文件中。

所以我想在屏幕上显示这个:

whatever output from command1
whatever output from command2

这在日志文件中:

+ command1
+ command2

(如果日志文件包含所有内容,也可以)

set -x 2> file明明好好尝试采取正确的效果,因为它不是set命令的输出,但它改变的bash的行为。

使用bash 2> file整个剧本还没有做正确的事,因为它重定向在这个shell中运行,以及每个命令的标准错误,所以我没有看到的命令的错误消息。


2
我的Google-fu今天早上似乎很强大:在不
干扰

Answers:


20

基于此ServerFault答案,在不中断标准输出的情况下将bash -x输出发送到日志文件,现代版本的bash包括BASH_XTRACEFD专门用于为输出的bash 指定备用文件描述符的方法。set -x

因此,例如,您可以

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

发送set -xto文件的输出,logfile同时保留以下命令的常规标准输出和标准错误流。

请注意,使用fd 19是任意的-它只需要是一个可用的描述符(即,不是0、1、2或您已经分配的另一个数字)。


它确实单独保存了bash跟踪日志,但是由于它们完全不同步,因此很难读取2个输出(屏幕上的stdout + stderr和日志文件中的bash跟踪)。查看解决方案我刚刚发布的内容
redseven

4

一年多以后,我找到了一种正确的解决方案,即在屏幕上同时显示“正常”输出(stdout + stderr-bash跟踪),以及将所有结果(stdout + stderr + bash跟踪)一起存储在文件中(bash.log) :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

那只是钢铁司机的答案和这个答案的结合。
佳诺

3

Steeldriver 为您提供了一种方法。或者,您可以简单地将STDERR重定向到文件:

script.sh 2> logfile

但是,这意味着该set -x选项创建的输出和产生的任何其他错误消息都将进入该文件。Steeldriver的解决方案只会重定向set -x您可能想要的输出。


“ ...由set -x选项创建的输出以及产生的任何其他错误消息都将进入文件。”这就是为什么它对我不起作用的原因。我的主要问题是,我不太容易看到“实际错误”,因为所有这些bash输出都将输出到stderr。重定向命令错误消息也会以另一种方式使我隐藏“实际错误”。
redseven

@redseven恐怕您要求的不是很清楚。您能否编辑您的问题并加以澄清?尝试避免将不会输出的内容用于术语“输出”。是否要分开i)正常输出​​;ii)您的命令抛出任何错误,并且iii)设置-x?钢铁司机的答案还不够吗?如果没有,请向我们展示一个简单的脚本,我们可以将其复制并告诉我们您希望它如何运行。
terdon

@steeldriver已经完美地回答了这个问题。
redseven

@redseven啊,那么酷。由于您的评论来得太晚了,所以我认为您仍然需要一些东西,而且我看不到Steeldriver的答案如何无法解决您的问题。高兴的是,一切都整理了。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.