我正在尝试构建一个应用程序,使用户能够与命令行交互式shell进行交互,如IRB或Python . 这意味着我需要将用户输入传递到shell中,并将shell的输出传递回用户 .
我希望这将像管道STDIN,STDOUT和STDERR一样简单,但是大多数shell似乎对STDIN输入的响应不同,而不是直接键盘输入 .
例如,以下是将STDIN传递给 python 时发生的情况:
$ python 1> py.out 2> py.err <
> print 'hello'
> hello
> print 'goodbye'
> EOI
$ cat py.out
hello
$ cat py.err
Traceback (most recent call last):
File "", line 2, in
NameError: name 'hello' is not defined
似乎Python将STDIN解释为脚本文件,并且它不管道任何交互式接口,例如行的开头的“>>>” . 它也在第一行失败并出错,因为我们在outfile中看不到“再见” .
以下是 irb (Interactive Ruby)的情况:
$ irb 1> irb.out 2> irb.err <
> 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 `'
puts 'goodbye'
goodbye
nil
$ cat irb.err
IRB的响应与Python不同:即,即使出现错误,它也会继续执行命令 . 但是,它仍然缺少shell接口 .
应用程序如何与交互式shell环境交互?