我正在尝试构建一个应用程序,使用户能够与命令行交互式 shell(例如 IRB 或 Python)进行交互。这意味着我需要将用户输入通过管道传输到 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 解释为脚本文件,并且它不会通过管道传输任何交互界面,例如行开头的“>>>”。它也会在第一行失败并出现错误,因为我们在输出文件中没有看到“再见”。
这是发生的事情irb
(交互式红宝石):
$ 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 环境交互?
从技术上讲,您的第一个示例并不是通过管道将输入传递给 Python;而是通过管道将输入传递给 Python。它来自一个文件——是的,文件输入的处理方式不同。
说服程序其输入来自终端的方法是使用伪终端。有主端和从端;您将把 shell(Python、Ruby)挂接到从端,并让控制程序向主端写入和读取。
设置起来相当棘手。你可能会做得更好使用expect
或其克隆之一来管理伪终端。除其他相关问题外,请参阅如何执行自动 Unix 输入? https://stackoverflow.com/questions/3874262/how-to-perform-automated-unix-input
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)