tags:

views:

176

answers:

1

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. User types "ls" into my program.
  3. Program sends this command to the bash process.
  4. Program reads all available output of the bash (including the prompt) and displays it back to the user.
  5. 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.

A: 

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
blinry