Я пытаюсь перенести некоторый код Python, как показано ниже, на Ruby:
import pty
pid, fd = pty.fork
if pid == 0:
# figure out what to launch
cmd = get_command_based_on_user_input()
# now replace the forked process with the command
os.exec(cmd)
else:
# read and write to fd like a terminal
Поскольку мне нужно читать и писать в подпроцесс, как терминал, я понимаю, что вместо Kernel.fork я должен использовать модуль PTY Руби. Но, похоже, у него нет эквивалентного метода fork; Я должен передать команду в виде строки. Это самое близкое, что я могу получить к функциональности Python:
require 'pty'
# The Ruby executable, ready to execute some codes
RUBY = %Q|/proc/#{Process.id}/exe -e "%s"|
# A small Ruby program which will eventually replace itself with another program. Very meta.
cmd = "cmd=get_command_based_on_user_input(); exec(cmd)"
r, w, pid = PTY.spawn(RUBY % cmd)
# Read and write from r and w
Очевидно, что некоторые из них связаны с Linux, и это нормально. И, очевидно, некоторые из них - псевдокод, но это единственный подход, который я могу найти, и я только на 80% уверен, что он все равно будет работать. Конечно, у Руби есть что-то чище?
Важно то, что "get_command_based_on_user_input ()" не блокирует родительский процесс, поэтому я вставил его в дочерний процесс.