2013-05-11 169 views
1

我正在嘗試構建一個應用程序,使用戶能夠與命令行交互式shell(如IRB或Python)進行交互。這意味着我需要將用戶輸入輸入到shell中,並將shell的輸出返回給用戶。如何管理交互式shell的輸入和輸出?

我希望這會像管道STDIN,STDOUT和STDERR一樣簡單,但大多數shell似乎對STDIN輸入的反應不同,而不是直接鍵盤輸入。

例如,這裏是我管STDIN到python會發生什麼:

$ python 1> py.out 2> py.err <<EOI 
> print 'hello' 
> hello 
> print 'goodbye' 
> EOI 
$ cat py.out 
hello 
$ cat py.err 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'hello' is not defined 

看來,Python是解釋STDIN爲一個腳本文件,它不會管任何的人機交互界面,就像行開頭的「>>>」一樣。它也在第一行失敗,因爲我們在outfile中看不到「再見」。

這裏是irb(交互式Ruby)會發生什麼:

$ irb 1> irb.out 2> irb.err <<EOI 
> puts 'hello' 
> hello 
> puts 'goodbye' 
> EOI 
$ cat irb.out 
Switch to inspect mode. 
puts 'hello' 
hello 
nil 
hello 
NameError: undefined local variable or method `hello' for main:Object 
    from (irb):2 
    from /path/to/irb:16:in `<main>' 
puts 'goodbye' 
goodbye 
nil 

$ cat irb.err 

IRB比Python的反應不同:即,它繼續執行命令,即使有錯誤。但是,它仍然缺少shell界面。

應用程序如何與交互式shell環境交互?

回答

1

從技術上講,您的第一個示例不是將輸入傳送給Python;它來自一個文件 - 是的,文件輸入的處理方式不同。

說服程序輸入來自終端的方式是使用僞tty。有一個主方和一個奴隸方;你會將shell(Python,Ruby)掛接到從屬端,並讓你的控制程序寫入並從主端讀取。

設置起來相當困難。使用expect或其中一個克隆來管理僞tty可能會更好。在其他相關問題中,請參閱How to perform automated Unix input?

+0

感謝您的信息。我不知道應用程序能夠判斷他們的STDIN是來自鍵盤(tty)還是來自管道/文件。在我的情況下,我很幸運,我使用的shell有一個選項來強制它進入「交互模式」,這使得它跳過了tty測試。 [IRB示例](http://www.ruby-forum.com/topic/126906)。如果你使用shell XYZ,快速搜索「XYZ強制交互模式」應該告訴你這個選項是否已經存在。 – sffc 2013-05-13 02:02:00

相關問題