开发者

Wrapper around bash, control STDIN and STDOUT

I would like to talk to a interactive bash process.

Here is an example, so you know what I want to archieve:

  1. Program starts a new bash process.
  2. 开发者_开发百科
  3. User types "ls" into my program.
  4. Program sends this command to the bash process.
  5. Program reads all available output of the bash (including the prompt) and displays it back to the user.
  6. GOTO 1

As you can guess, there is much room for nifty manipulations here and there... ;-)

It would be wonderful if this also worked for subprocesses (started by the bash process) and curses-based programs.

I would like to implement this functionality in Ruby, and already have experimented with IO.popen, but strange things happen. You are also welcome to do this in other languages.


Ok, I've found a solution. This work pretty nicely, you can even start vim inside it :-)

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

This does the following:

  • enable character-wise input (limited to UNIXoids, I'm afraid)
  • create a pseudo-TTY, start a interactive bash session inside
  • forward each character from STDIN to the bash
  • print every output back to the user


Have you tried using the Session gem?

  • http://rubygems.org/gems/session
  • https://github.com/ahoward/session (Homepage with introduction.)

I don't have any experience with it, but the README seems to describe what you want. It's description says, "session kicks the ass", so it should be fun/productive to play with it in any case.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜