2016-01-27 9 views
6

std::process::Command::spawnで外部プログラムを実行します。さらに、私はなぜプロセスを生成するのに失敗したのかを知りたいのですが:与えられたプログラム名が存在しない/ PATHにないか、あるいは別のエラーのためですか?私が達成したいもののコマンドがPATH /実行可能プロセスにあるかどうか確認してください。

例コード:

match Command::new("rustc").spawn() { 
    Ok(_) => println!("Was spawned :)"), 
    Err(e) => { 
     if /* ??? */ { 
      println!("`rustc` was not found! Check your PATH!") 
     } else { 
      println!("Some strange error occurred :("); 
     } 
    }, 
} 

私は私のシステムではなく、プログラムを実行しようとすると、私が手:

Error { repr: Os { code: 2, message: "No such file or directory" } } 

しかし、私はしないでくださいそれに頼りたいプログラムがPATHに存在するかどうかを判断する方法はありますか?

答えて

6

e.kind()を使用すると、エラーErrorKindを見つけることができます。

match Command::new("rustc").spawn() { 
    Ok(_) => println!("Was spawned :)"), 
    Err(e) => { 
     if let NotFound = e.kind() { 
      println!("`rustc` was not found! Check your PATH!") 
     } else { 
      println!("Some strange error occurred :("); 
     } 
    }, 
} 

編集:私は、エラーの種類を返すことができるかについて明示的なドキュメントを見つけられませんでしたので、私はソースコードを見上げました。 OSから直接エラーが返されたようです。関連コードはsrc/libstd/sys/[unix/windows/..]/process.rsにあるようです。 Unixのバージョンからの抜粋:

つ以上編集:あなたはgithub

でそれを見ることができるように、ライセンスは実際に、ここでは錆の発生源の一部を掲載することができます場合は、2番目の考えでは、私はわからないんだけどこれはちょうどError::from_raw_os_err(...)を返します。 Windows版はもっと複雑に見えて、どこからエラーが返ってくるのかはすぐにはわかりませんでした。いずれにしても、それはあなたのオペレーティングシステムの慈悲であるようです。少なくとも私はsrc/libstd/process.rsで次のテストを発見した:

同上:githubErrorKind::NotFoundバイナリが見つからない、少なくともときに返されるべきであることを保証するようだ

。それは、OSがNotFoundエラーを他のケースでは与えないと思うが、誰が知っているのだろうと仮定することは理にかなっている。プログラムが実際に見つからなかったことを絶対に確信したい場合は、$ PATH内のディレクトリを手動で検索する必要があります。何かのように:

use std::env; 
use std::fs; 

fn is_program_in_path(program: &str) -> bool { 
    if let Ok(path) = env::var("PATH") { 
     for p in path.split(":") { 
      let p_str = format!("{}/{}", p, program); 
      if fs::metadata(p_str).is_ok() { 
       return true; 
      } 
     } 
    } 
    false 
} 

fn main() { 
    let program = "rustca"; // shouldn't be found 
    if is_program_in_path(program) { 
     println!("Yes."); 
    } else { 
     println!("No."); 
    } 
} 
+0

ありがとう:)しかし、私はもう少し深い答えを期待した。マニュアルページやその他のドキュメントへのリンク。私の 'if'条件は、プログラムが見つからなかった場合にのみ評価するべきです。それは事実ですか?どのようなエラーが返されるのかについての詳細はありますか? –

+0

PATH区切り記号はWindowsでは ';'です。 –

+0

@FrancisGagnéとディレクトリセパレータ '\'。私の例は確かにUnixだけでした。おそらくそれを言及していたはずです。 – jkiiski

関連する問題