【问题标题】:How to determine the directory in which a running Haskell script or application lives?如何确定正在运行的 Haskell 脚本或应用程序所在的目录?
【发布时间】:2011-03-21 05:53:51
【问题描述】:

我有一个 Haskell 脚本,它通过使用 runhaskell 实用程序的 shebang 行运行。比如……

#! /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 可执行文件所在的目录。

【问题讨论】:

    标签: haskell path absolute-path


    【解决方案1】:

    据我了解,这在 *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

    【讨论】:

    • FindBin 包似乎也适用于基于 runhaskell 的脚本。
    【解决方案2】:

    有一个FindBin 包似乎可以满足您的需求,它也适用于已编译的程序。

    【讨论】:

      【解决方案3】:

      对于已编译的可执行文件,在 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.) 
      

      【讨论】:

        【解决方案4】:

        executable-path 与我的 runghc 脚本一起使用。 FindBin 对我不起作用,因为它返回了我的当前目录而不是脚本目录。

        【讨论】:

          【解决方案5】:

          我找不到从 Haskell 确定脚本路径的方法(恕我直言)。但是,作为一种解决方法,您可以将 Haskell 脚本包装在 shell 脚本中:

          #!/bin/sh
          
          SCRIPT_DIR=`dirname $0`
          
          runhaskell <<EOF
          main = putStrLn "My script is in \"$SCRIPT_DIR\""
          EOF
          

          【讨论】:

            猜你喜欢
            • 2012-05-03
            • 2014-10-05
            • 2012-01-01
            • 1970-01-01
            • 2019-07-20
            • 1970-01-01
            • 2022-12-14
            相关资源
            最近更新 更多