Как определить каталог, в котором находится запущенный скрипт или приложение на Haskell? - PullRequest
10 голосов
/ 26 июля 2010

У меня есть скрипт на Haskell, который запускается через строку shebang с использованием утилиты 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, используя ту же технику или иным образом.

Ответы [ 5 ]

8 голосов
/ 26 июля 2010

Насколько я понимаю, это исторически сложно в * 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

7 голосов
/ 26 июля 2010

Существует пакет FindBin , который, кажется, соответствует вашим потребностям, и он также работает для скомпилированных программ.

5 голосов
/ 18 мая 2013

Для скомпилированных исполняемых файлов в 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.) 
0 голосов
/ 27 августа 2018

Существует путь к исполняемому файлу , который работал с моим runghc сценарием. FindBin у меня не сработало, так как он вернул мой текущий каталог вместо директории скрипта.

0 голосов
/ 16 сентября 2010

Я не смог найти способ определить путь к скрипту из Haskell (что очень жаль ИМХО). Однако, в качестве обходного пути, вы можете обернуть ваш скрипт на Haskell в скрипт оболочки:

#!/bin/sh

SCRIPT_DIR=`dirname $0`

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