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

bli*_*nry 2 ruby bash wrapper

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

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

  1. 程序启动一个新的bash过程.
  2. 用户在我的程序中键入"ls".
  3. 程序将此命令发送到bash进程.
  4. 程序读取bash的所有可用输出(包括提示)并将其显示回用户.
  5. GOTO 1

你可以猜到,这里和那里有很多空间可以轻松操作...... ;-)

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

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

bli*_*nry 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
Run Code Online (Sandbox Code Playgroud)

这样做如下:

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