Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Использовать терминал с сессией через Ruby

Ruby дает выполнять команды •Nix терминала через System, Exec, Irb и тд, но у меня не получается сохранить сессию между командами. То есть я открываю консольное приложение в нем через, например, exec("./app"), но внутренние команды исполнить не могу, как сделал бы это через обычную сессию /bin/sh.
# ./app app> do_something
Вот этот do_something и "отпадывает".
Спасибо кто откликнется, может библиотеки знает по этой теме, всему рад.
UPD: То есть у меня есть ./app и внутри него мне надо исполнить ряд действий отлавливая вывод инфы и на ее основе слать команды дальше. А проблема, с которой я сталкиваюсь, это когда программа доходит до команды запуска приложения она перенаправляет меня в терминал и прерывается (ожидая завершения работы текущей программы), а мне нужно исполнить внутри открывшегося ./app еще команды.


Ответ

Читайте внимательнее документацию.
exec делает "немножко" не то, что вы ожидаете
Replaces the current process by running the given external command
...он замещает текущий процесс Ruby. То есть, на этой строчке ваша программа завершается, вместо неё ОС приклеивает процесс, который вы запустили.
Скорее всего, вам нужен модуль Open3 из стандартной библиотеки, а конкретно методы popen3 и/или popen2. Они запускают новый процесс, прицепив к его потокам стандартного IO подконтрольные Ruby потоки, а также создают отдельный Thread, который ждёт завершения процесса.
То, что вы вводили бы с клавиатуры, подавайте в полученный stdin нового процесса, и не забывайте читать его stdout и stderr, поскольку размер их буферов обычно ограничен, и их заполенность может повесить программу. В документации есть об этом детали.

Комментариев нет:

Отправить комментарий