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

Mat*_*zyk 9 haskell

我们可以在以下foo帮助下运行流程System.Process.proc:

createProcess $ proc "foo" []
Run Code Online (Sandbox Code Playgroud)

但是我们提前知道是否foo可以找到.我们可以运行它并捕获异常,但这很糟糕.我们也可以先打电话,which但也很糟糕.在process图书馆中我们发现RawCommand了截至今天所说的内容

FilePath参数命名可执行文件,并根据平台搜索可执行文件的标准策略进行解释.特别:

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

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

这正是我想要做的,但似乎没有任何暴露的功能.我只是错过了它,是否有更规范/更好的方式,还是我必须通过process内部挖掘?解决方案应该是可移植的(Windows/Linux).

Yur*_*ras 5

看起来你想要这里的findExecutable功能。

Prelude System.Directory> findExecutable "gcc"
Just "/usr/bin/gcc"
Run Code Online (Sandbox Code Playgroud)