2010-07-26 47 views
9

我有一个通过使用runhaskell实用程序的shebang行来运行的Haskell脚本。 E.g ...现在如何确定正在运行的Haskell脚本或应用程序的目录?

#! /usr/bin/env runhaskell 
module Main where 
main = do { ... } 

,我希望能够确定在该脚本驻留从脚本中,本身目录。所以,如果脚本存在于/home/me/my-haskell-app/script.hs中,我应该能够使用相对路径或绝对路径从任何位置运行它,并且它应该知道它位于/home/me/my-haskell-app/目录中。

我认为System.Environment模块中可用的功能可能会有所帮助,但效果会有所下降。 getProgName似乎没有提供有用的文件路径信息。我发现环境变量_(这是一个下划线)有时包含脚本的路径,因为它被调用;然而,只要脚本通过其他程序或父脚本调用,该环境变量似乎失去了它的价值(我需要从另一个父应用程序调用我的Haskell脚本)。

也有用的知道是否我可以使用相同的技术或其他方法确定预编译的Haskell可执行文件所在的目录。

回答

6

有一个FindBin包似乎适合您的需要,它也适用于编译的程序。

8

据我所知,这在历史上是非常棘手的* nix。有一些语言库来提供这种行为,包括FindBin Haskell的:

http://hackage.haskell.org/package/FindBin

我不知道这是什么将一个脚本,虽然报告。可能是runhaskell在执行之前编译的二进制文件的位置。

此外,对于已编译的Haskell项目,Cabal构建系统提供了data-dir和data-files以及相应的生成的Paths_<yourproject>.hs,用于在运行时为您的项目定位已安装的文件。

http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#paths-module

+1

FindBin包似乎也适用于基于runhaskell的脚本。 – 2010-07-26 21:08:20

0

我无法找到一种方法来确定从哈斯克尔(这是一个实在可惜恕我直言)脚本路径。然而,作为一种解决方法,你可以用你的哈斯克尔脚本一个shell脚本里面:

#!/bin/sh 

SCRIPT_DIR=`dirname $0` 

runhaskell <<EOF 
main = putStrLn "My script is in \"$SCRIPT_DIR\"" 
EOF 
5

对于编译的可执行文件,在GHC 7.6或更高版本可以使用System.Environment.getExecutablePath

getExecutablePath :: IO FilePathSource 

    Returns the absolute pathname of the current executable. 
    Note that for scripts and interactive sessions, this is the path to the 
    interpreter (e.g. ghci.) 
相关问题