我试图运行用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之前使用它来实现自己的文件搜索 - 但这会破坏跨平台的兼容性。还有其他建议吗?
答案 0 :(得分:2)
尝试使用shell
代替proc
,即:
createProcess (shell "elm")
这应该通过shell调用elm
,希望能够根据需要解释$PATH
中的波浪号。
更新:以下是我为测试shell
做什么而进行的实验...
编译以下程序(我称之为run-foofoo
):
import System.Process
main = do (,,_,h)< - createProcess $ shell“foofoo” ec< - waitForProcess h print ec
创建一个新目录~/new-bin
并将以下perl脚本作为文件foofoo
放置:
#!的/ usr / bin中/ perl的
print“到这里,PATH是$ ENV {PATH} \ n”;
运行: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