2010-07-26 11 views
9

Ho uno script Haskell che viene eseguito tramite una linea shebang che utilizza l'utilità runhaskell. Per esempio ...Come determinare la directory in cui risiede uno script Haskell o un'applicazione in esecuzione?

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

Ora, mi piacerebbe essere in grado di determinare la directory in cui risiede lo script all'interno dello script, in sé. Quindi, se la sceneggiatura risiede in /home/me/my-haskell-app/script.hs, dovrei essere in grado di eseguirlo da qualsiasi luogo, utilizzando un percorso relativo o assoluto, e dovrebbe sapere che si trova nella directory /home/me/my-haskell-app/.

Ho pensato che la funzionalità disponibile nel modulo System.Environment potrebbe essere di aiuto, ma è stata un po 'corta. getProgName non sembra fornire utili informazioni sul percorso del file. Ho trovato che la variabile di ambiente _ (che è un trattino basso) a volte contiene il percorso dello script, come è stato richiamato; tuttavia, non appena lo script viene richiamato tramite un altro programma o script genitore, quella variabile d'ambiente sembra perdere il suo valore (e ho bisogno di invocare il mio script Haskell da un'altra applicazione madre).

Inoltre, è utile sapere se posso determinare la directory in cui risiede un eseguibile Haskell precompilato, utilizzando la stessa tecnica o altrimenti.

risposta

6

C'è un pacchetto FindBin che sembra adatto alle proprie esigenze e funziona anche per programmi compilati.

8

Come ho capito, questo è storicamente complicato in * nix. Ci sono librerie per alcune lingue per fornire questo comportamento, tra cui FindBin per Haskell:

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

Non sono sicuro di ciò che questo riporterà con uno script però. Probabilmente il percorso del binario che runhaskell è stato compilato appena prima di eseguirlo.

Inoltre, per i progetti Haskell compilati, il sistema di build Cabal fornisce file di dati e di dati e il corrispondente generato Paths_<yourproject>.hs per l'individuazione dei file installati per il progetto in fase di esecuzione.

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

+1

Il pacchetto FindBin sembra funzionare correttamente anche per gli script basati su runhaskell. –

0

non riuscivo a trovare un modo per determinare il percorso script da Haskell (che è un vero peccato IMHO). Tuttavia, come soluzione alternativa, si può avvolgere lo script Haskell all'interno di uno script di shell:

#!/bin/sh 

SCRIPT_DIR=`dirname $0` 

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

Per eseguibili compilati, In GHC 7.6 o versione successiva è possibile utilizzare 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.) 
Problemi correlati