事情更简单。这首先基于 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”命令。