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:
- Program starts a new bash process. 开发者_开发百科
- User types "ls" into my program.
- Program sends this command to the bash process.
- Program reads all available output of the bash (including the prompt) and displays it back to the user.
- 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.
精彩评论