Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中重定向stdin和stdout以获得全面的日志文件_Bash_Shell_Logging_Io Redirection - Fatal编程技术网

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

在bash中重定向stdin和stdout以获得全面的日志文件,bash,shell,logging,io-redirection,Bash,Shell,Logging,Io Redirection,我在使用I/O重定向创建综合日志文件时遇到一些问题。我拥有的是一个bashshell脚本,它创建了文本文件,这些文本文件后来被用于输入一些FORTRAN程序。所以基本上我有, echo -e "Responses \nTo \nFORTRAN \nPromts" > myprogram.in myprogram < myprogram.in 这很好,我从FORTRAN程序中获得了所需的结果,但我希望有一个记录文件.log,显示FORTRAN提示符stdout,后跟响应stdin

我在使用I/O重定向创建综合日志文件时遇到一些问题。我拥有的是一个bashshell脚本,它创建了文本文件,这些文本文件后来被用于输入一些FORTRAN程序。所以基本上我有,

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

myprogram < myprogram.in 
这很好,我从FORTRAN程序中获得了所需的结果,但我希望有一个记录文件.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的开始提示

请输入一些内容 你回答了我的回答

请输入其他内容 你回答了

等等

我知道,基本上我所做的就是将stdin复制到file.log中,并将其通过管道传输到我的程序中。然后将程序提示重定向到文件.log

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

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

tee file.log < myprogram.in | myprogram >> file.log
这是myprogram的开始提示

请输入一些内容 回应

你回答了我的回答

请输入其他内容 到

你回答了
等等……

您可以尝试脚本程序-它可能有帮助,也可能没有帮助,这取决于您的FORTRAN程序如何处理屏幕。基本上,您可以运行:

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


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

我不太确定您想要什么,但我想可以使用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"
}
输出如下所示,我认为您可以在运行它之前使用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
如果这不能完全满足您的需要,您可以查看其中的send_tty命令,希望向终端发送额外的程序输入副本-可能。

尝试以下方法:

#!/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中,您应该有输入和程序的日志…

感谢您的回复。不幸的是,我已经尝试了脚本命令。它会从FORTRAN程序中捕获提示,但不会将stdin捕获到FORTRAN程序中。感谢您的回复,但不幸的是,这也不起作用。作为第一行exec 6stdin.log。运行stdin.log后,它只是一个空文件。再次感谢您的回复标记。我理解你的意思,这可能有用。不幸的是,FORTRAN程序相当长且复杂,对于许多不同的情况有许多不同的提示。因此,编写expect脚本要比修补FORTRAN程序以响应每个输入复杂得多。这个问题似乎有点简单,我认为可以很容易地完成,但我开始认为,仅仅使用I/O重定向(如管道、文件描述符、进程子程序,甚至tee)是不可能的。答案可能只是修补FORTRAN程序以回显输入,而不是尝试使用shell检索输入?