2

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

像这样的程序的一个例子是 TeX,我会在一个文件上启动它,但是在这个过程中 TeX 可能会遇到一个用户错误,它必须询问用户如何修复。

本质上,我正在寻找可重入版本的 exec。

附言

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

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

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

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

我以 TeX 为例,所以让我给你看一个例子。我在Sample Tex上找到了一块 TeX样本。我打算输入一个错误,但似乎我不必让它阻塞我的系统。将其保存在 sample1.tex、sample2.tex、sample3.tex 中。

现在我想运行这段 ruby​​ 代码:

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: 

在每三次程序等待用户输入内容的位置。

4

2 回答 2

1

您可以fork配对exec

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

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

于 2020-06-18T04:46:24.570 回答
0

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

Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread|
  p stdout.read.chomp #=> "/"
}
于 2013-05-05T05:27:08.307 回答