У меня есть сценарий Haskell, который работает через строку хижины, использующую runhaskell
утилита. Например...
#! /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 живет, с помощью той же техники или иначе.
Существует пакет FindBin , который, кажется, соответствует вашим потребностям, а также работает для скомпилированных программ.
Насколько я понимаю, в * nix это исторически сложнее. Существуют библиотеки для некоторых языков, обеспечивающие такое поведение, включая FindBin для Haskell:
http://hackage.haskell.org/package/FindBin
Я не уверен, что это будет сообщать с помощью сценария. Вероятно, расположение двоичного файла, который runhaskell скомпилировал непосредственно перед его выполнением.
Кроме того, для скомпилированных проектов Haskell система сборки Cabal предоставляет каталог данных и файлы данных, а также соответствующие сгенерированные Paths_
для поиска установленных файлов вашего проекта во время выполнения.
http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#paths-module