问题
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.
回答1:
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
回答2:
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.
来源:https://stackoverflow.com/questions/2730642/wrapper-around-bash-control-stdin-and-stdout