2013-12-16 19 views
0

我遇到了一些麻煩,它們使用I/O重定向來創建全面的日誌文件。我擁有的是一個bash shell腳本,用於創建稍後用於輸入幾個FORTRAN程序的文本文件。所以基本上我有;在bash中重定向stdin和stdout以獲得全面的日誌文件

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

myprogram < myprogram.in 

這工作得很好,我得到我從FORTRAN程序需要的結果,但我想有顯示其次是響應FORTRAN提示(標準輸出)的記錄(file.log)(標準輸入),然後另一個FORTRAN提示和響應。

到目前爲止,我只能想出類似這樣的東西;

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

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

它產生一個file.log像下面的例子;

迴應

FORTRAN
提示

這是myprogram

開幕提示 「請輸入內容」
你回答 「迴應」

「請輸入別的東西」
你說「要」

等等

據我所知,基本上是我做的是用發球臺到標準輸入複製到文件.log並將其管入myprogram中。然後只是將程序提示重定向到file.log。

是否有可能將響應重定向並提示重定向到程序,以便問題和響應按照時間順序排列在我的日誌文件中;

這是myprogram

開幕提示 「請輸入內容」
迴應

你回答 「迴應」

「請輸入別的東西「

你說「要」
等....

+0

這個問題似乎有點簡單,我認爲它可以很容易地完成,但我開始認爲僅僅使用I/O重定向是不可能的(比如管道,文件描述符,進程管理甚至三通)。答案可能只是修補FORTRAN程序以迴應輸入,而不是嘗試使用shell檢索它? –

回答

1

你可以試試「腳本」程序 - 它可能還是取決於你的FORTRAN程序如何解決可能沒有幫助屏幕。基本上,你運行:

script somefilename 

然後像以前一樣運行你的程序。完成後,按Ctrl-D。所有會話都記錄在您在「script」之後指定的文件中。

或者,根據您的終端,您可能能夠在運行程序以選擇所有輸入和輸出後鍵入「Ctrl-A」,然後您可以有一個菜單選項來複制所有輸入和輸出可以將其粘貼到文檔中。

+0

感謝您的回覆。不幸的是我已經嘗試了腳本命令。它確實捕獲了FORTRAN程序中的提示,但沒有將stdin捕獲到FORTRAN程序。 –

1

我不完全確定你想要什麼,但認爲使用「期望」可以使下面的工作。首先,我有一些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" 
} 

然後我運行與控制,並使用「預期」日誌,就像這樣:

#!/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 

輸出看起來像這樣,我認爲你可以複製/粘貼,或在運行之前使用「腳本」命令捕獲(請參閱我的上一個答案)。

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」命令「期望」送方案投入的額外拷貝到終端 - 也許。

+0

再次感謝您的回覆。我明白你在做什麼,這可能會奏效。不幸的是,FORTRAN程序相當長和複雜,並且對於許多不同的情況有許多不同的提示。因此,編寫一個期望腳本比修補FORTRAN程序以迴應每個輸入要複雜得多。 –

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你應該有一個記錄你輸入你的程序......

+0

感謝您的回覆,但不幸的是,這也不起作用。由於第一行'exec 6 <&0'將文件描述符6設置爲shell終端窗口'dev/tty'。然後立即將文件描述符6更改爲stdin.log'exec 6> stdin.log'。運行stdin.log之後只是一個空文件。 –

相關問題