Обертка вокруг bash, управление STDIN и STDOUT - PullRequest
2 голосов
/ 28 апреля 2010

Я бы хотел поговорить с интерактивным процессом bash.

Вот пример, чтобы вы знали, что я хочу архивировать:

  1. Программа запускает новый процесс bash.
  2. Пользователь вводит "ls" в мою программу.
  3. Программа отправляет эту команду процессу bash.
  4. Программа считывает все доступные выходные данные bash (включая подсказку) и отображает их обратно пользователю.
  5. GOTO 1

Как вы можете догадаться, здесь и там много возможностей для изящных манипуляций ...; -)

Было бы замечательно, если бы это также работало для подпроцессов (запускаемых процессом bash) и программ на основе curses.

Я хотел бы реализовать эту функциональность в Ruby, и уже экспериментировал с IO.popen, но происходят странные вещи. Вы также можете сделать это на других языках.

Ответы [ 2 ]

5 голосов
/ 29 апреля 2010

Хорошо, я нашел решение.Это прекрасно работает, вы даже можете запустить 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

Это делает следующее:

  • включает ввод символов (ограничено UNIXoids, ябоюсь)
  • создать псевдо-TTY, запустить интерактивную сессию bash внутри
  • переслать каждый символ из STDIN в bash
  • распечатать каждый вывод обратно пользователю
1 голос
/ 29 июля 2011

Вы пробовали использовать гем Session?

У меня нет никакого опыта с этим, но README, кажется, описывает то, что вы хотите. В описании говорится: «сессия пинает задницу», поэтому в любом случае играть с ней должно быть весело / продуктивно.

...