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