2015-02-06 12 views
3

시스템에 앱이 있는지 확인해야합니다.명령이 존재하는지 확인하는 방법은 무엇입니까?

try 
{ 
    auto ls = execute(["fooapp"]); 
    if (ls.status == 0) writeln("fooapp is Exists!\n"); 
} 

catch (Exception e) 
{ 
     writeln("exception"); 
} 

앱이 예외를 throw하지 않고 존재 여부를 확인하기 위해 더 나은 방법이 있나요 : 실행 명령이없는 존재한다면 나는 그것을 사용 다음 코드를 생각하다 예외 std.process?

답변

3

나는 단순히 명령을 실행하는 것에 대해 매우 걱정할 것입니다. 그것이 무엇을해야하는지 알더라도 시스템에 같은 이름의 다른 프로그램이 있다면 (우연히 또는 악의적으로) 명령을 실행하는 것만으로는 이상하고 아마도 나쁜 것일 수 있습니다. AFAIK, 제대로 이것을하는 것은 시스템 특정 일이 될 것이고 내가 제안 할 수있는 최선은 시스템에 어떤 명령 행 셸이든 활용하는 것입니다.

이 두 가지 질문에 대한 대답은 Linux에서이 작업을 수행하는 방법에 대한 좋은 정보를 제공하는 것으로 보이며, BSD에도 유효 할 것으로 기대합니다. Mac OS X에서도 마찬가지 일지 모르지만 기본적으로 명령 줄 셸과 관련하여 Mac OS X의 기능에 익숙하지 않으므로 잘 모르겠습니다.

How to check if command exists in a shell script?

Check if a program exists from a Bash script

답은 아래 type 명령을 사용하는 거의 종기에 보인다, 그러나 당신은 답변에서 세부 사항을 읽어야합니다. Windows의 경우, 빠른 검색이 밝혀 :

Is there an equivalent of 'which' on the Windows command line?

는 Windows에서 문제를 공격하기 위해 여러 가지 방법을 제공 할 것으로 보인다. 그래서, 거기에 무엇이있어, 특정 명령이 존재하는지 여부를 알려주는 쉘 명령을 Windows에서 실행하는 것이 가능해야합니다. 에 관계없이 비록 OS의

, 당신이해야 할 겁니다 것은

bool commandExists(string command) 
{ 
    import std.process, std.string; 
    version(linux) 
     return executeShell(format("type %s", command)).status == 0; 
    else version(FreeBSD) 
     return executeShell(format("type %s", command)).status == 0; 
    else version(Windows) 
     static assert(0, "TODO: Add Windows magic here."); 
    else version(OSX) 
     static assert(0, "TODO: Add Mac OS X magic here."); 
    else 
     static assert(0, "OS not supported"); 
} 

같은 것입니다 그리고 그것은 일부 시스템이 될 수있다, 당신은 실제로 명령의 출력을 구문 분석해야합니다 그 상태를 보지 않고 올바른 결과를 주 었는지 확인하십시오. 불행히도, 이것은 정확히 시스템 고유의 것이 될 것입니다.

파일이 PATH에 기본적으로 환경에 존재하는 경우는 (그래서 이것은 Windows가 ... 다른 대답으로 밝혔다을 추가 할을 마법) 창에서이 기능을 사용할 수 있습니다
1

, 그것은 검사 :

string envFind(in char[] filename, string envVar = "PATH") 
{ 
    import std.process, std.array, std.path, std.file; 
    auto env = environment.get(envVar); 
    if (!env) return null; 
    foreach(string dir; env.split(";")) { 
     auto maybe = dir ~ dirSeparator ~ filename; 
     if (maybe.exists) return maybe.idup; 
    } 
    return null; 
} 

기본적인 사용법 :

if (envFind("cmd.exe") == "") assert(0, "cmd is missing"); 
if (envFind("explorer.exe") == "") assert(0, "explorer is missing"); 
if (envFind("mspaint.exe") == "") assert(0, "mspaintis missing");