Tag: popen3

为什么Open3.popen3在缺少可执行文件时返回错误的错误?

我正在围绕CLI创建一个Ruby包装器。 我找到了一个简洁的方法, Open3.capture3 (内部使用Open3.popen3 ),它允许我执行命令并捕获stdout,stderr和退出代码。 我想要检测的一件事是,是否找不到CLI可执行文件(并为此引发特殊错误)。 我知道UNIX shell在找不到命令时给出退出代码127 。 当我在bash中执行$ foo时,我得到-bash: foo: command not found ,这正是我要显示的错误消息。 考虑到这一切,我写了这样的代码: require “open3” stdout, stderr, status = Open3.capture3(command) case status.exitstatus when 0 return stdout when 1, 127 raise MyError, stderr end 但是,当我使用command = “foo”运行它时,我收到一个错误: Errno::ENOENT: No such file or directory – foo /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `spawn’ /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `popen_run’ /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:93:in `popen3′ /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:252:in […]

ruby popen3 – 如何反复写入stdin并读取stdout而无需重新打开过程?

我正在使用Open3的popen3方法启动一个以类似控制台/ REPL方式运行的进程,以反复接受输入和返回输出。 我可以打开进程,发送输入,并接收输出就好了,代码如下: Open3.popen3(“console_REPL_process”) do |stdin, stdout, stderr, wait_thr| stdin.puts “a string of input” stdin.close_write stdout.each_line { |line| puts line } #successfully prints all the output end 我想连续多次这样做,而不需要重新打开过程,因为启动需要很长时间。 我知道我必须关闭stdin才能让stdout返回..但我不知道的是, 我如何重新打开’stdin以便我可以写更多输入? 理想情况下,我想做这样的事情: Open3.popen3(“console_REPL_process”) do |stdin, stdout, stderr, wait_thr| stdin.puts “a string of input” stdin.close_write stdout.each_line { |line| puts line } stdin.reopen_somehow() stdin.puts “another string of input” […]

Ruby-Open3.popen3 /如何打印输出

我有一个小的ruby脚本,它执行mysql导入: mysql -u -p -h < file.sql ,但是使用Open3.popen3来执行此操作。 这就是我到目前为止所拥有的: mysqlimp = “mysql -u #{mysqllocal[‘user’]} ” mysqlimp << "-h #{mysqllocal['host']} " mysqlimp << "-p#{mysqllocal['pass']} " mysqlimp << "#{mysqllocal['db']}" Open3.popen3(mysqlimp) do |stdin, stdout, stderr, wthr| stdin.write "DROP DATABASE IF EXISTS #{mysqllocal['db']};\n" stdin.write "CREATE DATABASE #{mysqllocal['db']};\n" stdin.write "USE #{mysqllocal['db']};\n" stdin.write mysqldump #a string containing the database data stdin.close […]

如何在Ruby中修复挂起的popen3?

我使用popen3得到了意想不到的行为,我想用它来运行像ala cmd file2这样的命令。 下面的示例挂起,因此永远不会达到stdout done 。 使用除cat之外的其他工具可能会导致挂起,因此永远不会达到stdin done 。 我怀疑,我正在缓冲,但我该如何解决这个问题呢? #!/usr/bin/env ruby require ‘open3’ Open3.popen3(“cat”) do |stdin, stdout, stderr, wait_thr| stdin.puts “foobar” puts “stdin done” stdout.each_line { |line| puts line } puts “stdout done” puts wait_thr.value end puts “all done”