2011-01-24 98 views
7

有没有办法在Ruby脚本中捕获“command not found”错误?例如,给出:从Ruby的反引号中捕获“命令未找到”错误?

output = `foo` 

如何捕获foo没有安装的情况?我预计我可以rescue一个例外,但这似乎并不适用于1.8.7。有没有一种不同的方式来调用子流程,以达到我想要的效果?还是有不同的方法?

更新

我的道歉,我忘了提一个隐藏的要求:我宁愿解释没有在命令行中泄漏到用户(它可以包含敏感数据),因此为什么异常捕捉法是优选的。再次抱歉,第一次离开这个。

+0

一种策略,当你需要的特定功能是有用的,是运行预检检查,在尝试运行之前先查找功能,应用程序或代码。说'which'foo'`或使用一对夫妇文件测试来查找文件的存在及其可执行性,会告诉你是否可以安全地继续执行,而无需实际尝试命令并失败。它提供了更好的用户体验,因为您可以控制对缺失功能的反应,或者选择替代路线,或者通知用户由于缺少某些内容而无法继续。 – 2011-01-25 02:11:45

+0

同意,但`哪'foo'`不是跨平台的,我想不出跨平台的方式去做它,除了尝试它并捕获错误... – kfb 2011-01-25 14:15:26

回答

13

使用返回码!

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 
相关问题