0

您将如何将脚本的标准输出和标准错误重定向到文件,同时将脚本的标准错误发送到标准输出。

为了显示:

测试脚本:

#!/bin/bash
echo "this goes to stdout"
echo "this goes to stderr" >&2

以将其打印到控制台的方式执行测试脚本:

this goes to stderr

这进入日志文件:

this goes to stdout
this goes to stderr

我觉得我接近使用 a fifo,但从未到达那里。需要的是一个teefor stderr。想法?

4

4 回答 4

0

我想这对于现在正在研究答案的人来说并不公平,但我想我明白了:

if [ ! -e /tmp/deployed.err ]
then
  mkfifo /tmp/deployed.err
fi

tee -a testlog </tmp/deployed.err &

./testscript 2>/tmp/deployed.err 1>>testlog

它似乎有效,但我担心日志中的消息会出现故障。有人有更好的主意吗?

于 2013-07-25T21:26:42.657 回答
0

You may try something like this

./script 2>&1 1>log | tee -a log

the stdout is send to log in 1>log and tee does the job of sending it to stdout and log.

PS: Somehow I have a bad feeling about this method. Please comment if you feel so.

于 2013-07-25T21:39:00.963 回答
0

这个

command 2>&1 | tee somefile

将同时发送 stderr 和 stdout 到teeso,同时发送到文件和 stdout。

如果你想将stderr和 stdout 重定向到不同的tee,你可以使用类似的东西:

command > >(tee out.log) 2> >(tee err.log >&2)

依此类推...(之间的空格> >(是强制性的)

于 2013-07-25T21:34:21.117 回答
0

事情更简单。这首先基于 bashizm 内部分支,测试脚本:

#!/bin/bash
for i in {1..1000}; do
    echo STDOUT $i>&1
    echo STDERR $i>&2
done

接下来,重定向脚本:

(./xxtext.sh 1>>logfile)2>&1|\ #subprocess/fork in brackets with redir stdout to logfile.
#above, main process redirect stderr to stdout for properly pipe
while read x; do echo $x; echo $x>>logfile; done #second read sequently stdin
#redirected from stderr, and both print to the screen and append to logfile.

不幸的是,这不能正确保存序列,因为两个流由两个不同的进程管理,并带有管道缓冲。

如果您真的想要保存序列,唯一的方法是使用“选择”系统调用并从内部打开的脚本中读取标准输出和标准错误。我相信 bash 不支持这一点。您可以在 C 或 Perl 或其他更高级的语言中执行此操作。我在 perl 中找到的有用示例:http ://www.perlmonks.org/bare/?node_id=419919 这调用了“bc”命令。

于 2013-08-22T11:53:37.303 回答