如何在Haskell中使用波浪扩展和$ PATH搜索进行处理?

时间:2014-11-13 03:43:09

标签: haskell process elm

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

createProcess (proc "elm" $ args fileName)

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

System.Process.proc命令在$ PATH中搜索其命令参数,但它没有进行波浪号(〜)扩展,因此它没有找到榆树。

System.Process.shell有相反的问题。它确实倾向于扩展,但它显然没有搜索$ PATH。

从System.Process命令的源代码看,大多数东西都依赖于外部ccall到" runInteractiveProcess",我假设它正在做任何$ PATH搜索。我不知道runInteractiveProcess的来源在哪里,而且我的C大约有15年的生锈。

我可以通过

解决这个问题

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

b)将elm从工作目录中混合到其在cabal / bin中的位置。

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

1 个答案:

答案 0 :(得分:2)

尝试使用shell代替proc,即:

createProcess (shell "elm")

这应该通过shell调用elm,希望能够根据需要解释$PATH中的波浪号。

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

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

    import 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

  4. 测试:

    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