2010-07-26 22 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.) 
相關問題