我需要从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:
在三次中,程序每次等待用户输入内容。
答案 0 :(得分:0)
Ruby标准库有一个特殊的命令可以满足您的需求。它被称为open3
。以下是其文档中的示例:
Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread|
p stdout.read.chomp #=> "/"
}
答案 1 :(得分:0)
您可以将fork
与exec
配对:
Process.fork { exec('./somescript') }
Process.wait
Process.wait
确保您等待子流程完成。