11

runhaskellユーティリティを利用してシバン行を介して実行される 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 実行可能ファイルが存在するディレクトリを特定できるかどうかも知っておくと役立ちます。

4

5 に答える 5

8

私が理解しているように、これは *nix では歴史的にトリッキーです。Haskell の FindBin など、一部の言語にはこの動作を提供するライブラリがあります。

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

于 2010-07-26T18:52:35.880 に答える
7

あなたのニーズに合ったFindBinパッケージがあり、コンパイルされたプログラムでも機能します。

于 2010-07-26T18:48:34.407 に答える
0

Haskell からスクリプト パスを特定する方法が見つかりませんでした (これは本当に残念なことです)。ただし、回避策として、Haskell スクリプトをシェル スクリプト内にラップすることができます。

#!/bin/sh

SCRIPT_DIR=`dirname $0`

runhaskell <<EOF
main = putStrLn "My script is in \"$SCRIPT_DIR\""
EOF
于 2010-09-16T14:09:17.207 に答える