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

问题描述 投票:2回答:2

我需要从ruby中启动一个子进程,接管然后返回控制权。这个子进程需要用户的交互式输入,所以它的io应该与stdin stdout和stderr绑定。此外,它还会根据不同的情况请求输入变化。

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

从本质上讲,我正在寻找一个再入版的exec.NET程序。

PS

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

这个子进程需要用户的交互式输入。

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

换句话说。本质上,我在寻找一个再进入版本的exec.

我以TeX为例,让我给你看一个例子。我在at上找到了一个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: 

其中在这三次中,每一次程序都会等待用户输入一些东西。

ruby input subprocess
2个回答
0
投票

Ruby标准库有一个特殊的命令来满足你的需求。它被称为 open3. 下面是其文档中的一个例子。

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

0
投票

你可以将 forkexec:

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

负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: Process.wait 确保你等待子进程完成。

© www.soinside.com 2019 - 2024. All rights reserved.