相关疑难解决方法(0)

将STDOUT和STDERR写入日志文件,也将STDERR写入屏幕

我想运行几个命令,并将所有输出捕获到日志文件.我还想将任何错误打印到屏幕上(或者可选地将输出邮寄给某人).

这是一个例子.以下命令将运行三个命令,并将所有输出(STDOUT和STDERR)写入单个日志文件中.

{ command1 && command2 && command3 ; } > logfile.log 2>&1
Run Code Online (Sandbox Code Playgroud)

这是我想要对这些命令的输出做的事情:

  • 所有命令的STDERR和STDOUT都会转到日志文件中,以防我以后需要它 - 除非有问题,否则我通常不会查看.
  • 将STDERR打印到屏幕(或者可选地,管道到/ bin/mail),以便任何错误突出并且不会被忽略.
  • 如果返回代码仍然可用,那将是很好的,这样我就可以做一些错误处理.如果出现错误,也许我想发送电子邮件,如下所示:

    {command1 && command2 && command3; }> logfile.log 2>&1 || mailx -s"有一个错误"stefanl@example.org

我遇到的问题是STDERR在I/O重定向期间丢失了上下文.'2>&1'会将STDERR转换为STDOUT,因此如果我执行2> error.log则无法查看错误

这里有几个多汁的例子.让我假装我正在运行一些熟悉的构建命令,但我不希望整个构建因为一个错误而停止,所以我使用'--keep-going'标志.

{ ./configure && make --keep-going && make install ; } > build.log 2>&1
Run Code Online (Sandbox Code Playgroud)

或者,这是一个简单的(也许是草率的)构建和部署脚本,它将在发生错误时继续运行.

{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
Run Code Online (Sandbox Code Playgroud)

我认为我想要的是某种Bash I/O重定向,但我无法解决这个问题.

unix bash shell

14
推荐指数
1
解决办法
2万
查看次数

同步保存stdout,stderr和stdout + stderr

出于测试目的,我想保存输出和错误分别通过随后的代码检查.例如,具有错误输入的测试运行应该导致输出到stderr,但是在stdout上没有输出,而具有正确输入的测试运行应该导致输出到stdout,但是没有输出到stderr.保存必须是同步的,以避免测试的竞争条件(因此我不能使用进程替换).

为了能够在事后调试测试,我需要在输出的序列中看到stdout和stderr.因此,我必须将它们保存到相同的文件/变量/任何/或者同时将它们发送到终端,以便单独保存它们.

为了测试发生了哪个错误,我需要命令的退出代码.

出于效率和准确性的原因,我当然不能每次测试两次.

例如,可以将stdout重定向到stdout.log,将stderr重定向到stderr.log,并将它们都重定向到output.log中的同一命令吗?或者为stdout和stderr分别使用同步 tee命令?或者将stdout和stderr的副本保存为单独的变量?

更新:看起来tim的解决方案几乎可以工作(修改为在终端上输出而不是记录到all.log):

$ set -o pipefail
$ {
    {
        echo foo | tee stdout.log 2>&3 3>&-
    } 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
foo
$ cat stderr.log
$ {
    {
        echo foo >&2 | tee stdout.log 2>&3 3>&-
    } 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat …
Run Code Online (Sandbox Code Playgroud)

bash redirect

9
推荐指数
1
解决办法
4396
查看次数

标签 统计

bash ×2

redirect ×1

shell ×1

unix ×1