gpt4 book ai didi

ruby - 如何在 ruby​​ 中代理 shell 进程

转载 作者:数据小太阳 更新时间:2023-10-29 08:41:16 25 4
gpt4 key购买 nike

我正在创建一个脚本来包装 jdb(java 调试器)。我基本上想包装这个过程并代理用户交互。所以我希望它:

  • 从我的脚本启动 jdb
  • 将jdb的输出发送到stdout
  • 当 jdb 执行时暂停并等待输入
  • 当用户输入命令时,传递给jdb

目前我真的很想通过 jdb。这样做的原因是使用特定参数初始化进程,并可能在将来添加更多命令。

更新:这是最终使用 expect 为我工作的 shell :

PTY.spawn("jdb -attach 1234") do |read,write,pid|
write.sync = true

while (true) do
read.expect(/\r\r\n> /) do |s|
s = s[0].split(/\r\r\n/)
s.pop # get rid of prompt

s.each { |line| puts line }

print '> '
STDOUT.flush

write.print(STDIN.gets)
end
end
end

最佳答案

使用Open3.popen3()。例如:

 Open3.popen3("jdb args") { |stdin, stdout, stderr|
# stdin = jdb's input stream
# stdout = jdb's output stream
# stderr = jdb's stderr stream
threads = []
threads << Thread.new(stderr) do |terr|
while (line = terr.gets)
puts "stderr: #{line}"
end
end
threads << Thread.new(stdout) do |terr|
while (line = terr.gets)
puts "stdout: #{line}"
end
end
stdin.puts "blah"
threads.each{|t| t.join()} #in order to cleanup when you're done.
}

我已经为您提供了线程示例,但您当然希望对 jdb 正在执行的操作做出响应。以上只是您如何打开进程并处理与之通信的框架。

关于ruby - 如何在 ruby​​ 中代理 shell 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4839075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com