我们可以在System.Process.proc
的帮助下运行进程foo
,如下所示:
createProcess $ proc "foo" []
然而,我们还不知道foo
是否能被找到。我们可以运行它并捕获一个异常,但这很糟糕。我们也可以先呼叫which
,但这也很糟糕。在process
库中,我们发现RawCommand
,截至今天,它显示
FilePath参数命名可执行文件,并进行解释根据平台的标准搜索策略可执行文件。具体而言:
在Unix系统上使用execvp(3)语义,其中如果可执行文件名不包含斜线(/),则PATH在环境变量中搜索可执行文件。
在Windows系统上使用Win32 CreateProcess语义。简而言之:如果文件名不包含路径,则包含父级的目录搜索可执行文件,然后是当前目录,然后是一些标准位置,最后是当前的PATH。.exe扩展名是如果文件名没有扩展名,则添加。对于完整有关详细信息,请参阅Windows SearchPath API的文档。
这正是我想做的,但似乎没有任何公开的功能可以做到这一点。我只是错过了它,有没有更规范/更好的方法,或者我必须深入了解process
内部?该解决方案应该是可移植的(Windows/Linux)。
看起来您想要findExecutable
函数。
Prelude System.Directory> findExecutable "gcc"
Just "/usr/bin/gcc"