Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 运行进程,捕获其输出并退出代码_Ruby - Fatal编程技术网

Ruby 运行进程,捕获其输出并退出代码

Ruby 运行进程,捕获其输出并退出代码,ruby,Ruby,我知道如何运行外部流程,因为有很多方法可以这样做。但是如何将其输出和退出代码捕获到变量中呢?这些是最流行的流程运行方式,但它们并没有按照我的要求工作: a = `ls -l` # "a" captures only output b = system "ls -l " # "b" captures only exit code 我想看一下,因为它将允许您获得stout/stderr和退出状态 另请参阅本页,其中还详细介绍了popen4的用法 status = Open4::popen4("fa

我知道如何运行外部流程,因为有很多方法可以这样做。但是如何将其输出和退出代码捕获到变量中呢?这些是最流行的流程运行方式,但它们并没有按照我的要求工作:

a = `ls -l` # "a" captures only output
b = system "ls -l " # "b" captures only exit code

我想看一下,因为它将允许您获得stout/stderr和退出状态

另请参阅本页,其中还详细介绍了popen4的用法

status = Open4::popen4("false") do |pid, stdin, stdout, stderr|
    puts "stdout: #{stdout}" 
end
puts status

我想看一下,因为它将允许您获得stout/stderr和退出状态

另请参阅本页,其中还详细介绍了popen4的用法

status = Open4::popen4("false") do |pid, stdin, stdout, stderr|
    puts "stdout: #{stdout}" 
end
puts status

这里有一个方法可以解决这个问题

#!/usr/bin/env ruby

require 'open3'

Open3.popen3("ls -l") do |stdin, stdout, stderr, wait_thr|
  puts stdout.read
  puts wait_thr.value.exitstatus 
end

# >> total 52
# >> -rw-r--r-- 1 arup users    0 Aug  5 09:32 a.rb
# >> drwxr-xr-x 2 arup users 4096 Jul 20 20:37 FSS
# >> drwxr-xr-x 2 arup users 4096 Jul 20 20:37 fss_dir
# >> -rw-r--r-- 1 arup users   42 Jul 19 01:36 out.txt
# .....
#...
# >> 0

Doco非常清楚这一点<代码>标准输出提供对象。所以,我们需要使用方法。而
等待\u thr.值
给出了我们。现在,一旦我们有了那个对象,我们就可以使用同样的方法了。

这里有一个方法来解决这个问题

#!/usr/bin/env ruby

require 'open3'

Open3.popen3("ls -l") do |stdin, stdout, stderr, wait_thr|
  puts stdout.read
  puts wait_thr.value.exitstatus 
end

# >> total 52
# >> -rw-r--r-- 1 arup users    0 Aug  5 09:32 a.rb
# >> drwxr-xr-x 2 arup users 4096 Jul 20 20:37 FSS
# >> drwxr-xr-x 2 arup users 4096 Jul 20 20:37 fss_dir
# >> -rw-r--r-- 1 arup users   42 Jul 19 01:36 out.txt
# .....
#...
# >> 0
#my_prog.rb
puts 'hello'
exit 10
Doco非常清楚这一点<代码>标准输出
提供对象。所以,我们需要使用方法。而
等待\u thr.值
给出了我们。现在,一旦我们有了那个对象,我们就可以使用同样的方法

#my_prog.rb
puts 'hello'
exit 10


最合适的方法是阅读
$?。exitstatus

a = `ls -l`        # gets output
b = $?.exitstatus  # gets exit code
测试:


有关处理退出状态的更多方法,请参阅。

最合适的方法是读取
$?。退出状态

a = `ls -l`        # gets output
b = $?.exitstatus  # gets exit code
测试:

有关处理退出状态的更多方法,请参阅


我希望exception作为类exception的实例能够 重新提起它,而不仅仅是一根绳子

您可以这样做:

#my_prog.rb

puts 'hello'
10/0

不幸的是,有几个异常的名称不以“Error”结尾——但是您可以修改代码来搜索错误消息中的特定名称


我希望exception作为类exception的实例能够 重新提起它,而不仅仅是一根绳子

您可以这样做:

#my_prog.rb

puts 'hello'
10/0


不幸的是,有几个例外的名称不以“Error”结尾,但您可以修改代码来搜索错误消息中的特定名称。

为什么我要使用gem,Ruby中没有标准方法吗?我发布的第二个链接介绍了Ruby中的5种标准方法。第六种方法,使用gem,是唯一一种可以同时获得状态和输出的方法,我认为它做得很好。第六种方法,使用gem,是唯一一种可以同时获得状态和输出的方法…不正确。如其他答案所示,你是正确的。我自己也确实学到了一些东西!为什么我要使用gem,Ruby中没有标准方法吗?我发布的第二个链接描述了Ruby中的5种标准方法。第六种方法,使用gem,是唯一一种可以同时获得状态和输出的方法,我认为它做得很好。第六种方法,使用gem,是唯一一种可以同时获得状态和输出的方法…不正确。如其他答案所示,你是正确的。我自己也确实学到了一些东西!@halfelf的可能重复,是什么意思的重复?@halfelf的可能重复,是什么意思的重复?为什么不对多行块使用“do”?@AlexanderSupertramp复制粘贴..错误..:-)对不起,我如何从stderr检索错误(异常)?@AlexanderSupertramp没有理解你。您想要
异常
类名吗?是
stderr
将以字符串形式向您提供错误消息。我希望异常作为类异常的实例能够重新引发它,而不仅仅是字符串。为什么不对多行块使用“do”?@AlexanderSupertramp Copy paste..err..-)对不起,我如何从stderr检索错误(异常)?@AlexanderSupertramp没有理解你。您想要
异常
类名吗?是
stderr
将以字符串形式向您提供错误消息。我希望异常作为类异常的实例能够重新引发它,而不仅仅是字符串。很好+1.……如果您不喜欢perl类变量名(谁喜欢?!!),您可以这样写:
需要“english”
put$CHILD\u STATUS.exitstatus
Nice+1.……如果您不喜欢类似perl的变量名(谁喜欢?!!),您可以这样写:
需要“english”
放置$CHILD\u状态。exitstatus