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