使用相同的shell进程从ruby执行shell命令

在Ruby中,有没有办法执行多个shell命令强制它们使用相同的shell进程?

例如,某些东西会使“(或系统或popen)表现得像:

$ irb > `echo $$` => "999\n" > `echo $$` => "999\n" 

IO.popen

使用IO.popen您可以生成一个新进程并使用其stdin和stdout。 此示例中的"r+"是此处读取和写入的访问模式。 两个回声都将由相同的bash解释,因此将产生相同的进程ID。

 IO.popen("/bin/sh", "r+") do |p| p.puts("echo $$") puts p.readline p.puts("echo $$") puts p.readline p.puts("exit") end 

限制

如果你在这个bash中启动一个程序,你无法通过读取stdout天气来判断程序是否终止。 特别是如果启动的程序模拟了bash提示符,它可能会让你误以为它已经终止了。 要区分这样的程序和bash,需要从内核中检索进程树。 阅读此流程树比上面的代码片段更复杂。

EXEC

但要注意,如果你在这个bash中执行程序,它们就不会有相同的pid,因为bash会为每个执行的进程生成一个新进程。 unix启动新程序的唯一方法就是执行exec。 使用exec,新程序的实例与旧程序具有相同的pid。 但是,在执行exec之后,旧的程序实例不再存在,因此永远不会重新获得控制权。 要使两个程序实例具有相同的id,您需要告诉第一个程序执行第二个程序。 这可能适用于自编写或修改过的程序,但大多数程序不包含此类function。

这对你有用吗?

 system "echo $$; echo $$" # => 5009 5009