【发布时间】:2013-08-27 15:31:04
【问题描述】:
在 Ruby 中,是否可以防止生成的子进程的标准输入附加到终端,而不必捕获同一进程的 STDOUT 或 STDERR?
反引号和 x 字符串(
`...`、%x{...})不起作用,因为它们捕获 STDIN。Kernel#system不起作用,因为它会将 STDIN 附加到 终端(拦截^C之类的信号并阻止它们 到达我的程序,这是我试图避免的)。Open3不起作用,因为它的方法捕获STDOUT或STDOUT和STDERR。
那我应该用什么?
【问题讨论】:
-
你为什么不花时间展示一些你正在尝试做的事情的例子。不要让我们猜测或尝试设想您的代码。那是浪费时间。见sscce.org
-
@theTinMan 我不明白这在这种情况下如何适用。我没有要修复的损坏的代码,我有一个关于 Ruby 的 API 的特定问题需要回答。我已经列出了三个不起作用的例子。你想让我把这些例子放在上下文中并证明它们不起作用吗? :困惑:
-
像
open3那样捕获 STDOUT 和 STDERR 是什么,你想避免吗?如果它们没有被父进程捕获和管理,你希望它们去哪里? -
@NeilSlater 我希望他们去任何父进程的
STDOUT和STDERR去的地方;就像Kernel#system一样。 -
父进程默认将 STDOUT 连接到 TTY 设备。使用
> /dev/tty重定向孩子的STDOUT 将像父母一样,阻止父母看到或捕获输出。您可以使用| tee /dev/stdout /dev/tty将输出返回到父级并同时输出到终端/tty 设备。操作系统的tty命令也很有用。 /dev 设备必须小心使用,但有些设备对于这种技巧很方便。这不是 Ruby 的东西,而是 *nix 的东西。