以编程方式检查可执行文件是否存在而不运行它或使用`which`

时间:2017-10-30 17:20:41

标签: haskell

我们可以在foo的帮助下运行流程System.Process.proc,如下所示:

createProcess $ proc "foo" []

但我们事先并不知道是否可以找到foo。我们可以运行它并捕获异常,但这很糟糕。我们也可以先呼叫which,但这也很糟糕。在process库中,我们找到了RawCommand,截至今天所说的

  

FilePath参数命名可执行文件,并进行解释   根据平台的标准搜索政策   可执行文件。具体做法是:

     
      
  • 在Unix系统上使用execvp(3)语义,如果可执行文件名不包含斜杠(/),则使用PATH   搜索环境变量以查找可执行文件。

  •   Windows系统上的
  •   使用Win32 CreateProcess语义。简而言之:如果是文件名   不包含路径,然后包含父目录   搜索可执行文件,然后搜索当前目录,然后搜索一些   标准位置,最后是当前的PATH。 .exe扩展名是   如果文件名还没有扩展名,则添加。完整的   有关详细信息,请参阅Windows SearchPath API的文档。

  •   

这正是我想要做的事情,但似乎没有任何暴露的功能可以做到这一点。我只是错过了它,是否有更规范/更好的方法,还是我需要挖掘process内部结构?解决方案应该是可移植的(Windows / Linux)。

1 个答案:

答案 0 :(得分:3)

您希望来自herefindExecutable功能。

Prelude System.Directory> findExecutable "gcc"
Just "/usr/bin/gcc"