从Ruby的反引号中捕获“命令未找到”错误?

时间:2011-01-24 15:01:43

标签: ruby subprocess backticks

有没有办法在Ruby脚本中捕获“找不到命令”错误?例如,给定:

output = `foo`

如何捕获未安装foo的情况?我预计我可以rescue例外,但这似乎不适用于1.8.7。是否有一种不同的方式来调用子进程来执行我想要的操作?或者有不同的方法吗?

更新

我道歉,我忘了提到一个隐藏的要求:我希望解释器不会将命令行泄漏给用户(它可能包含敏感数据),因此首选异常捕获方法的原因。再次道歉,第一次离开这个。

1 个答案:

答案 0 :(得分:14)

使用返回代码!

irb(main):001:0> `date`
=> "Mo 24. Jan 16:07:15 CET 2011\n"
irb(main):002:0> $?
=> #<Process::Status: pid=11556,exited(0)>
irb(main):003:0> $?.to_i
=> 0
irb(main):004:0> `foo`
(irb):4: command not found: foo
=> ""
irb(main):005:0> $?.to_i
=> 32512

http://corelib.rubyonrails.org/classes/Process/Status.html

将STDERR重定向到STDOUT会将输出作为返回值,而不是将其膨胀:

irb(main):010:0> `foo 2>&1`
=> "sh: foo: not found\n"
irb(main):011:0> $?.to_i
=> 32512