在bash中重定向stdin和stdout以获取全面的日志文件

时间:2013-12-16 21:57:15

标签: bash shell logging io-redirection

使用I / O重定向创建综合日志文件时遇到了一些麻烦。我所拥有的是一个bash shell脚本,它创建的文本文件稍后用于输入一些FORTRAN程序。所以基本上我有;

echo -e "Responses \nTo \nFORTRAN \nPromts" > myprogram.in

myprogram < myprogram.in 

这很好用,我从FORTRAN程序中得到了我需要的结果,但我希望有一条记录(file.log)显示FORTRAN提示符(stdout),然后是响应(stdin),然后是另一个FORTRAN提示符和回应。

到目前为止,我只能想出这样的东西;

echo -e "Responses \nTo \nFORTRAN \nPromts" > myprogram.in

tee file.log < myprogram.in | myprogram >> file.log

生成一个file.log,如下例所示;

响应
   为了
   FORTRAN
   提示

这是myprogram的开启提示

“请输入内容”
   您回复了“回复”

“请输入其他内容”
   您回答“收件人”

等...

据我所知,我所做的基本上是使用tee将stdin复制到file.log并将其传输到myprogram中。然后只是将程序提示重定向到file.log。

是否有可能重定向响应并提示同时重定向到程序,因此问题和响应按时间顺序排列在我的日志文件中,如下所示;

这是myprogram的开启提示

“请输入内容”
   回复

您回复了“回复”

“请输入其他内容”
   

您回答“收件人”
等....

3 个答案:

答案 0 :(得分:1)

您可以尝试“脚本”程序 - 根据您的FORTRAN程序如何处理屏幕,它可能会有所帮助,也可能没有帮助。基本上,你运行:

script somefilename

然后像以前一样运行你的程序。完成后,按Ctrl-D。所有会话都记录在“脚本”一词之后指定的文件中。

或者,根据您的终端,您可以在运行程序以选择所有输入和输出后键入“Ctrl-A”,然后您可以使用菜单选项将其全部复制,以便您可以将其粘贴到文档中。

答案 1 :(得分:1)

我不确定你想要什么,但认为使用“expect”可以使以下工作。首先,我用一些Perl粗略地模拟你的FORTRAN程序 - 当然你会使用自己真正的FORTRAN程序:

Filename: FORTRAN_prog

#!/usr/bin/perl
use strict;
use warnings;
print "FORTRAN Question 1:";
my $name = <STDIN>;
print "FORTRAN Question 2:";
$name = <STDIN>;
print "FORTRAN Question 3:";
$name = <STDIN>;
for(my $i=0;$i<10;$i++){
print "FORTRAN output $i\n"
}

然后我运行并控制并使用“expect”记录它,如下所示:

#!/usr/bin/expect
spawn ./FORTRAN_prog
expect "Question 1:"
send "Answer 1\n"
expect "Question 2:"
send "Answer 2\n"
expect "Question 3:"
send "Answer 3\n"
interact

输出看起来像这样,我认为你可以在运行之前使用“script”命令进行复制/粘贴或捕获(参见我之前的回答)。

FORTRAN Question 1:Answer 1
FORTRAN Question 2:Answer 2
FORTRAN Question 3:Answer 3
FORTRAN output 0
FORTRAN output 1
FORTRAN output 2
FORTRAN output 3
FORTRAN output 4
FORTRAN output 5
FORTRAN output 6
FORTRAN output 7
FORTRAN output 8
FORTRAN output 9

如果这不能达到您想要的效果,您可以查看“expect”中的“send_tty”命令,将额外的程序输入副本发送到终端 - 也许。

答案 2 :(得分:0)

试试这个:

#!/bin/bash

exec 6<&0
exec 6>stdin.log

echo -e "Responses\nTo\nFORTRAN\nPrompts" > myprogram.in
tee file.log < myprogram.in | ./myprogram >> file.log

在stdin.log中,您应该记录您的输入和程序...