2

我正在使用我的 Ruby 脚本来调用系统命令,如下所示

puts "Reached point #1"

begin
  system("sh my_shell_script.sh")
rescue StandardError => e
  puts "There was an error"
end

puts "Reached point #2"

我故意在我的 shell 脚本中添加了一个错误,所以它会失败(即我将“echo”拼写为“eho”)。我希望我的 Ruby 脚本会输出它到达标记 #1,然后挽救错误以显示“出现错误”。

相反,我得到:

"Reached point #1"
line 1: eho: command not found
"Reached point #2"

它肯定会抛出正确的错误,但 system(...) 的 shell 错误并没有被挽救。关于为什么的任何想法?

4

2 回答 2

5

Kernel#system 的文档中

systemtrue如果命令给出零退出状态,则返回,false对于非零退出状态。nil如果命令执行失败则返回。中提供了错误状态$?

这意味着您有很多方法可以继续(其中不涉及挽救引发的错误),具体取决于您想要的故障信息。如果您只想将成功执行命令的退出状态为零与所有形式的失败区分开来,这是您的代码的翻译:

puts "Reached point #1"

unless system("sh my_shell_script.sh")
  puts "There was an error"
end

puts "Reached point #2"

您当然可以通过查看返回值来区分命令执行失败和非零退出状态,$?如果需要,您可以根据文档获取退出状态代码。

于 2013-06-16T21:50:51.660 回答
1

相反,我得到:

"Reached point #1"
line 1: eho: command not found
"Reached point #2"

所以换句话说,它得到了拯救,但不是你所期望的那样。

你真正想要的可能更像是这样的:

ret = system("sh my_shell_script.sh")
puts $? unless ret

http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-system

于 2013-06-16T21:35:18.020 回答