【问题标题】:How do you pipe input and output to and from an interactive shell?你如何通过管道输入和输出到交互式 shell 和从交互式 shell 输出?
【发布时间】:2013-05-06 07:31:15
【问题描述】:

我正在尝试构建一个应用程序,使用户能够与命令行交互式 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(交互式 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 环境交互?

【问题讨论】:

    标签: shell stdout stdin interactive irb


    【解决方案1】:

    从技术上讲,您的第一个示例不是将输入通过管道传输到 Python;它来自一个文件——是的,文件输入的处理方式不同。

    说服程序其输入来自终端的方法是使用伪 tty。有主方和从方;您将 shell(Python、Ruby)连接到从属端,并让您的控制程序在主控端写入和读取。

    设置起来相当棘手。使用expect 或其克隆之一来管理伪tty 可能会做得更好。除其他相关问题外,请参阅How to perform automated Unix input?

    【讨论】:

    • 感谢您的信息。我不知道应用程序能够判断他们的 STDIN 是来自键盘(tty)还是来自管道/文件。就我而言,我很幸运,我正在使用的 shell 有一个选项可以强制它进入“交互模式”,这使它跳过了 tty 测试。 IRB Example。如果您使用的是 XYZ 外壳,快速搜索“XYZ 强制交互模式”应该会告诉您此选项是否已存在。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2021-03-21
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多