Ruby 将'STDOUT'和'STDIN'组合成一个'IO'对象
是否有一种方法可以创建单个Ruby 将'STDOUT'和'STDIN'组合成一个'IO'对象,ruby,unix,Ruby,Unix,是否有一种方法可以创建单个IO对象,其读取流是当前进程的STDOUT,而其写入流是当前进程的STDIN 这类似于IO.popen,它将命令作为子进程运行,并返回连接到子进程标准流的IO对象。但是,我不想运行子进程,我想使用当前的Ruby进程 有没有办法创建单个IO对象 不是。STDIN和STDOUT是两个不同的文件描述符。一个IO代表一个FD 但是,您可以制作类似IO对象的东西。 这可能包含一系列错误,因为复制FDs通常是不好的 require "forwardable" class IOTee
IO
对象,其读取流是当前进程的STDOUT
,而其写入流是当前进程的STDIN
这类似于IO.popen
,它将命令作为子进程运行,并返回连接到子进程标准流的IO
对象。但是,我不想运行子进程,我想使用当前的Ruby进程
有没有办法创建单个IO对象
不是。STDIN和STDOUT是两个不同的文件描述符。一个IO代表一个FD
但是,您可以制作类似IO对象的东西。
这可能包含一系列错误,因为复制FDs通常是不好的
require "forwardable"
class IOTee < IO
extend Forwardable
def_delegators :@in,
:close_read,
:read,
:read_nonblock,
:readchar,
:readlines,
:readpartial,
:sysread
def_delegators :@out,
:close_write,
:syswrite,
:write,
:write_nonblock
def initialize(input,output)
@in = input
@out = output
end
end
io = IOTee.new(STDIN,STDOUT) # You would swap these
io.puts("hi")
hi
=> nil
要求“可转发”
类IOTee零
根据您正在执行的操作,还有IO#pipe
和IO#reopen
,这也可能会有所帮助
我怀疑上述问题并不是你想要解决的问题,而是你在解决问题时遇到的问题
我怀疑你真正想要的是制作一个管道,然后重新打开两端的STDOUT
和STDIN
。将它们组合到单个IO对象中没有多大意义
此外,如果您通过
STDIN
和STDOUT
与自己交谈,在等待自己读取或写入数据时很容易陷入死锁。是的,我基本上按照您的建议重新打开了管道的每一端。我想我只是对IO.popen
如何将子进程的标准流连接到单个文件描述符感到困惑,但主进程却无法做到这一点。