Mam skrypt Haskell, który działa za pośrednictwem linii shebang przy użyciu narzędzia runhaskell
. Np ...Jak określić katalog, w którym działa uruchomiony skrypt lub aplikacja Haskell?
#! /usr/bin/env runhaskell
module Main where
main = do { ... }
Teraz chciałbym być w stanie określić katalog, w którym rezyduje że skrypt od wewnątrz skryptu, sama. Tak więc, jeśli skrypt będzie działał w /home/me/my-haskell-app/script.hs
, powinienem móc uruchomić go z dowolnego miejsca, używając względnej lub bezwzględnej ścieżki, i powinien wiedzieć, że znajduje się w katalogu /home/me/my-haskell-app/
.
Myślałem, że funkcjonalność dostępna w module System.Environment
może być pomocna, ale trochę się skróciła. getProgName
nie zapewniało użytecznych informacji o ścieżce pliku. Odkryłem, że zmienna środowiskowa _
(to podkreślenie) oznaczałaby ścieżkę do skryptu, ponieważ została wywołana; jednakże, jak tylko skrypt zostanie wywołany przez jakiś inny program lub skrypt macierzysty, ta zmienna środowiskowa wydaje się tracić swoją wartość (i potrzebuję wywołać mój skrypt Haskell z innej, macierzystej aplikacji).
Warto również wiedzieć, czy mogę określić katalog, w którym żyje skompilowany plik wykonywalny Haskell, używając tej samej techniki lub w inny sposób.
Pakiet FindBin wydaje się również działać poprawnie w przypadku skryptów opartych na runhaskell. –