Ruby中的进程替换(不是命令替换)

Ruby中的进程替换(不是命令替换),ruby,Ruby,在bash、zsh、ksh88、ksh93和类似的shell中,可以简单地生成一个文件名(根据平台的需要,该文件名被实现为/dev/fd条目或命名管道),其中给定的代码段在子shell中执行 我感兴趣的是在Ruby解释器中做同样的事情——用它的一个参数(文件名)执行一个子进程,当读取该文件名时,它将流式地输出在当前Ruby解释器或相同的子进程中运行的代码 内容是安全敏感的,因此写入临时文件并不理想 bash中的等效代码: ./run-program --password-file=<(p

在bash、zsh、ksh88、ksh93和类似的shell中,可以简单地生成一个文件名(根据平台的需要,该文件名被实现为
/dev/fd
条目或命名管道),其中给定的代码段在子shell中执行

我感兴趣的是在Ruby解释器中做同样的事情——用它的一个参数(文件名)执行一个子进程,当读取该文件名时,它将流式地输出在当前Ruby解释器或相同的子进程中运行的代码

内容是安全敏感的,因此写入临时文件并不理想


bash中的等效代码:

./run-program --password-file=<(printf '%s' "$password")
…其中可以读取
/dev/fd/5
(恰好一次,作为流),以检索展开
$password
的结果



在Ruby中实现相同调用约定的最佳方法是什么?

基本答案可能是从Ruby的方法中构建一些东西。这将允许您启动另一个进程并控制子进程用于输入和输出的文件对象


请注意,处理此问题可能很棘手;手边有一个好的Unix应用程序编程参考资料会很有帮助。Ruby实际上只是在一些低级的Unix/C API上做了一个薄薄的包装。

IO.popen
做的事情与
()
做的事情是一样的——这是一个棘手的问题,为什么有一个规范的、同行评审的答案会有价值,这就是为什么我在亲自尝试之前在这里问这个问题的原因。:)嗯。
IO.popen(“-”{| f | f.puts(密码)}
可能就是我在这里要找的。一个在OS X或其他没有
/dev/fd
的平台上运行的答案是理想的,但这可能已经足够好了。我不知道OS X,但这些都只是POSIX标准化C函数的包装,用于IPC和管道,所以这个东西可能是可移植的,它是POSIX没有指定的功能,我特别关注可移植性。这就是说,现在的OS X似乎已经采用了它。为了弄清楚为什么
IO.popen(“echo hi”)
不符合给定的要求,顺便说一句——请记住,我在传递密码内容;将它放在shell的命令行上并不完全安全,因为argv数组对系统上运行的任何东西都是公开的。一旦我使用
IO.popen(“-”
)获得了一个工作/测试的变体,我将在这里发布(并在您允许的情况下,将其编辑到您的答案中)。
./run-program --password-file=/dev/fd/5
fd=IO.popen("echo hi") #"r"--reading by default
fd.read 
   #=>"hi\n"
   #Read from the file object
#OR access via the filesystem representation of the filedescriptor
File.read("/dev/fd/#{fd.fileno}")
   #This is just how linux works (note in Linux, each process sees `/dev/fd/` differently--it's actually the open filedescriptors a process has)