4

我正在尝试运行用 Haskell 编写的 elm-reactor 项目。它失败了,因为它试图elm像这样执行命令:

createProcess (proc "elm" $ args fileName)

我的 elm 可执行文件位于 ~/.cabal/bin 中,它位于我的 PATH 中。

System.Process.proc命令在 $PATH 中搜索其命令参数,但它不执行波浪号 (~) 扩展,因此它找不到 elm。

System.Process.shell有相反的问题。它会进行波浪扩展,但显然不会搜索 $PATH。

从 System.Process 命令的源代码来看,看起来大多数事情都依赖于对“runInteractiveProcess”的外部 ccall,我假设它正在执行任何 $PATH 搜索。我不知道 runInteractiveProcess 的来源在哪里,而我的 C 语言已经生锈了大约 15 年。

我可以通过以下方式解决此问题

a) 将完全扩展的 cabal/bin 路径添加到我的 PATH 或

b) 符号链接elm到其在 cabal/bin 中的位置。

但是,我想为 elm 项目提供一个建议的修复,以节省未来的采用者我所经历的麻烦。有没有我没试过的System.Process电话,他们应该在这里打?还是他们应该使用不同的方法?我想在最坏的情况下他们可以getEnv为 PATH 和 HOME,并在调用 proc 之前使用它来实现他们自己的文件搜索——但这会破坏跨平台兼容性。还有其他建议吗?

4

1 回答 1

2

尝试使用shell代替proc,即:

createProcess (shell "elm")

这应该通过 shell 调用elm,希望可以$PATH根据需要解释波浪线。

更新:这是我为测试什么而进行的实验shell......

  1. 编译以下程序(我称之为run-foofoo):

    导入 System.Process

    main = do ( , ,_,h) <- createProcess $ shell "foofoo" ec <- waitForProcess h print ec

  2. 创建一个新目录~/new-bin并将以下 perl 脚本作为文件放置在那里foofoo

    #!/usr/bin/perl

    print "到了这里,PATH 是 $ENV{PATH}\n";

  3. 跑:chmod a+rx ~/new-bin/foofoo

测试:

PATH="/bin:/usr/bin:/sbin" ./run-foofoo                  # should fail
PATH="$HOME/new-bin:/bin:/usr/bin:/sbin" ./run-foofoo    # should succeed
PATH="~/new-bin:/bin:/usr/bin:/sbin" ./run-foofoo        # ???

在我的 OSX 系统上,第三次测试报告:

Got here and PATH is ~/new-bin:/bin:/usr/bin:/sbin
ExitSuccess
于 2014-11-13T04:45:12.133 回答