用Ruby解救bash/system-STDERR

用Ruby解救bash/system-STDERR,ruby,shell,exception,system,Ruby,Shell,Exception,System,我使用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,然后解救错

我使用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"
"Reached point #1"
line 1: eho: command not found
"Reached point #2"
它当然抛出了正确的错误,但是系统(…)的shell错误没有被挽救。有没有想过为什么

相反,我得到的是:

"Reached point #1"
line 1: eho: command not found
"Reached point #2"
"Reached point #1"
line 1: eho: command not found
"Reached point #2"
换句话说,它被救了,但不是以你期望的方式

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

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

来自:

system
如果命令给出零退出状态,则返回
true
;如果命令给出非零退出状态,则返回
false
。如果命令执行失败,则返回
nil
。错误状态在
$?
中可用

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

puts "Reached point #1"

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

puts "Reached point #2"

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

系统
不会引发错误。请参阅一个说明:终端输出显示“第1行:eho:未找到命令”,但从$?检索到的错误显示“pid 32303出口127”。如何访问实际的终端输出而不是状态代码?@user2490003您不能;这样不行。如果需要该命令的输出,请使用backticks(
`sh my\u shell\u script.sh`
)。这将使您重新使用
开始
/
救援