执行需要交互式输入的ruby子进程

时间:2013-05-05 05:06:24

标签: ruby input subprocess

我需要从ruby启动一个子进程,接管然后返回控制。 这个子进程需要来自用户的交互式输入,因此它应该与stdin stdout和stderr绑定。此外,它根据具体情况要求输入更改。

像这样的程序的一个示例是TeX,我将从文件开始,但在此过程中TeX可能会遇到用户错误,它必须询问用户如何修复。

基本上我正在寻找一个可重入的exec版本。

PS

对于那些不能仔细阅读的人,让我重申一下。

此子流程需要来自用户的交互式输入

这意味着如果ruby程序在tty中运行,那么它的输出将转到tty而不是Ruby程序,它的输入来自tty,而不是Ruby程序。

换句话说: 基本上我正在寻找一个可重入的exec版本。

我以TeX为例,让我举个例子。我在Sample Tex 找到了一块TeX示例。我打算发一个错误,但似乎我不需要在我的系统上使用它。将其保存在sample1.tex,sample2.tex,sample3.tex。

现在我想运行这段红宝石代码:

files=["sample1.tex","sample2.tex","sample3.tex"]
files.each{|file|
     # It is really a latex command.
     commmand_that_I_am_looking_for("latex #{file}")
 }

当我运行此代码时,我应该在终端中看到一堆东西:

关于乳胶计划的一般信息,处理进展等。

! LaTeX Error: File `html.sty' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)
Enter file name: 

在三次中,程序每次等待用户输入内容。

2 个答案:

答案 0 :(得分:0)

Ruby标准库有一个特殊的命令可以满足您的需求。它被称为open3。以下是其文档中的示例:

Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread|
  p stdout.read.chomp #=> "/"
}

答案 1 :(得分:0)

您可以将forkexec配对:

Process.fork { exec('./somescript') }
Process.wait

Process.wait确保您等待子流程完成。