当前位置:  开发笔记 > 编程语言 > 正文

如何让STDOUT和STDERR转到终端和日志文件?

如何解决《如何让STDOUT和STDERR转到终端和日志文件?》经验,为你挑选了2个好方法。

我有一个脚本,将由非技术用户以交互方式运行.该脚本将状态更新写入STDOUT,以便用户可以确保脚本运行正常.

我希望STDOUT和STDERR都重定向到终端(这样用户就可以看到脚本工作正常,看看是否有问题).我还希望将两个流重定向到日志文件.

我在网上看到了很多解决方案.有些不起作用,有些则非常复杂.我已经开发了一个可行的解决方案(我将作为答案输入),但它很笨拙.

完美的解决方案是一行代码,可以合并到任何脚本的开头,该脚本将两个流发送到终端和日志文件.

编辑:将STDERR重定向到STDOUT并将结果传递给tee工作,但这取决于用户记住重定向和管道输出.我希望日志记录是万无一失的(这就是为什么我希望能够将解决方案嵌入脚本本身.)



1> Paul Tomblin..:

使用"tee"重定向到文件和屏幕.根据您使用的shell,首先必须使用stderr将stderr重定向到stdout

./a.out 2>&1 | tee output

要么

./a.out |& tee output

在csh中,有一个名为"script"的内置命令可以捕获进入文件的所有内容.您可以通过键入"script"来启动它,然后执行您要捕获的任何操作,然后按control-D关闭脚本文件.我不知道sh/bash/ksh的等价物.

此外,由于您现在已经指出这些是您自己可以修改的sh脚本,您可以通过用括号或括号括起整个脚本来内部进行重定向,例如

  #!/bin/sh
  {
    ... whatever you had in your script before
  } 2>&1 | tee output.file


请注意,stdout和stderr之间的区别将会丢失,因为tee会将所有内容打印到stdout.
我不知道你可以在shell脚本中括起命令.有趣.
仅供参考:大多数脚本中都提供“脚本”命令(它是util-linux软件包的一部分)

2> Jason Sydes..:

差不多五年后......

我相信这是OP寻求的"完美解决方案".

这是一个可以添加到Bash脚本顶部的单行程序:

exec > >(tee -a $HOME/logfile) 2>&1

这是一个演示其用途的小脚本:

#!/usr/bin/env bash

exec > >(tee -a $HOME/logfile) 2>&1

# Test redirection of STDOUT
echo test_stdout

# Test redirection of STDERR
ls test_stderr___this_file_does_not_exist

(注意:这仅适用于Bash.它不适用于/ bin/sh.)

改编自这里 ; 根据我的判断,原始文件没有在日志文件中捕获STDERR.修复了这里的注释.


请注意,stdout和stderr之间的区别将会丢失,因为tee会将所有内容打印到stdout.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有