Простой пример, который не работает на моей платформе (Ruby 2.2
, Cygwin
):
#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
Process.detach(backtt)
exit
Эта крошечная программа (когда она запускается из оболочки) должна охватывать окно терминала (mintty), а затем возвращает меня в приглашение оболочки.
Однако, пока он создает окно mintty, после этого у меня нет приглашения оболочки, и я не могу ничего вводить в вызывающей оболочке.
Но когда я вводю небольшую задержку перед отсоединением, либо используя "sleep", либо печатая что-то на stdout, он работает как ожидалось:
#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
sleep 1
Process.detach(backtt)
exit
Почему это необходимо?
Кстати, я хорошо знаю, что я мог (из оболочки) сделать
mintty /usr/bin/zsh -i &
или я мог бы использовать систему (...... &
) внутри Ruby, но здесь дело не в этом. Меня особенно интересует поведение fork/exec/detach
в Ruby. Любые идеи?