2011-01-24 12 views
7

Rubyスクリプトで「コマンドが見つかりません」というエラーをキャプチャする方法はありますか?例えば、与えられた:Rubyのバッククックから「コマンドが見つかりません」というエラーをキャプチャしていますか?

output = `foo` 

どのようにトラップfooがインストールされていない状況ですか?私はrescueに例外があると予想しましたが、これは1.8.7では動作しません。私が望むことをするサブプロセスを呼び出す別の方法はありますか?それとも別のアプローチがありますか?

更新

私の謝罪、私は隠された要件を言及するのを忘れてしまった:私は、インタプリタがユーザーにコマンドラインを漏洩しないことを好むだろう(それは機密データを含むことができます)、それゆえ、なぜ例外捕獲方法が好ましい。これを初めて出すことについてもう一度謝ります。

+0

あなたが特定の機能を必要とする場合に有用な1つの戦術、さプリフライトチェックを実行したり、機能やアプリケーションを探したり、コードを実行したりする前に実行してください。 '' foo''と言ったり、いくつかのファイルテストを使ってファイルの存在と実行可能性を調べると、実際にコマンドを試行せずに失敗しても安全かどうかがわかります。欠落している機能にどのように対応するかを制御し、代替ルートに移動するか、ユーザーに何かが見つからないために進むことができないことを通知できるため、ユーザーエクスペリエンスが向上します。 –

+0

合意されましたが、 '' foo''はクロスプラットフォームではないので、クロスプラットフォームの方法でそれを試してエラーをキャッチする以外にはできません。 – kfb

答えて

13

リターンコードを使用してください。 STDOUTへ

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だけではなく、外に膨満感の戻り値として、あなたに出力を与える:

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

ありがとう!しかし、私は、コマンドラインをリークさせないという余分な要件について言及することを忘れていました。私が正しく理解していれば、まだコマンドが見つからないというメッセージがユーザに表示されます。 – kfb

+0

私の答えにこれを行う方法の例を追加しました。 –

+0

魅力的な作品です!ありがとう! – kfb

関連する問題