2016-06-13 70 views
1

我有一個Perl腳本,用反引號調用另一個程序,並檢查某些字符串的輸出。這運行良好。Perl腳本與另一個程序的STDIN交互

我遇到的問題是當其他程序在做什麼時出現故障並等待用戶輸入。它要求用戶在退出程序之前按兩次輸入。

如何告訴我的Perl腳本在此程序上按兩次Enter?

+2

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod – xxfelixxx

回答

3

的啓動命令從您的腳本接收到相同的STDIN和STDERR,只是STDOUT通過管道輸送到你的腳本。

您可以在運行命令之前關閉STDIN,並且不會有輸入源。從標準輸入讀取會導致錯誤和被叫命令將退出:

close STDIN; 
my @slines = `$command`; 

這也將導致控制檯輸入的任何機會,你的腳本。

另一種方法是使用IPC::Open2,讓你的腳本在同一時間,以控制標準輸入和命令的標準輸出:

use IPC::Open2; 
open2($chld_in, $chld_in, 'some cmd and args'); 
print $chld_in "\n\n"; 
close $chld_in; 
@slines = <$chld_out>; 
close $chld_out; 

這個腳本提供了命令所需的兩個\n輸入和讀取命令的輸出。

+0

我發現使用'close STDIN'不允許我捕獲正在運行的程序的完整輸出。我假設你的代碼中有一個錯字 - 它應該是'open2($ chld_out,$ chld_in,'一些cmd和args');'? 但是我仍然遇到同樣的問題 - 我讀過這是因爲我在Windows上運行? –

+0

我設法通過在open2行之後添加兩行來實現這個工作:'sleep(10);打印$ chld_in;' - 我假設它發送給孩子,然後準備好接受\ n \ n,並且我發現在其他地方打印$ chld_in可以幫助Windows系統。謝謝@Sebastian指引我朝着正確的方向前進 –

2

你可以只管他們:

echo "\n\n" | yourcommand 
+0

我當前的代碼看起來是這樣的:我 = @slines'「$ command'; 難道則成爲: 我@slines = echo「\ n \ n」|'「$ command'; ? –