包装在bash周围,控制STDIN和STDOUT

时间:2010-04-28 15:02:52

标签: ruby bash wrapper

我想谈谈一个互动的bash过程。

这是一个例子,所以你知道我想要什么:

  1. 程序启动一个新的bash过程。
  2. 用户在我的程序中输入“ls”。
  3. 程序将此命令发送到bash进程。
  4. 程序读取bash的所有可用输出(包括提示)并将其显示给用户。
  5. GOTO 1
  6. 你可以猜到,这里和那里有很多空间可以进行漂亮的操作......; - )

    如果这也适用于子进程(由bash进程启动)和基于curses的程序,那将是非常好的。

    我想在Ruby中实现这个功能,并且已经尝试过IO.popen,但奇怪的事情发生了。您也可以用其他语言进行此操作。

2 个答案:

答案 0 :(得分:5)

好的,我找到了解决方案。这项工作非常好,你甚至可以在其中启动vim: - )

require "pty"

system("stty raw -echo")

PTY.spawn("bash -i") do |pin, pout|
    Thread.new do
        loop do
            pout.print STDIN.getc.chr
        end
    end

    loop do
        print pin.sysread(512)
        STDOUT.flush
    end
end

执行以下操作:

  • 启用字符输入(仅限于UNIXoids,我很害怕)
  • 创建一个伪TTY,在
  • 中启动一个交互式bash会话
  • 将每个角色从STDIN转发到bash
  • 将每个输出打印回用户

答案 1 :(得分:1)

您是否尝试过使用Session gem?

我对此没有任何经验,但README似乎描述了你想要的东西。它的描述说,“会议踢屁股”,所以在任何情况下玩它都应该是有趣/富有成效的。