【问题标题】:Haskell get a specific user's home directory pathHaskell 获取特定用户的主目录路径
【发布时间】:2017-12-24 19:46:21
【问题描述】:

我想创建一个函数,用该用户的主目录(通常为/home/user/)扩展~user 形式的名称,包括~root,通常为/root/。我知道getHomeDirectory 方法,用于获取当前用户的主目录,但我不知道任何确定给定用户主目录的函数。

到目前为止

我有以下函数,它将任何文件路径中的前导~替换为用户的主目录

-- join path with '/', except at root
-- opposite of breakPath
rejoinPath :: [FilePath] -> FilePath
rejoinPath []   = ""
rejoinPath (p:ps)
    | p == "/"  =  p ++ go ps
    | otherwise =  go (p:ps)
    where
        go :: [FilePath] -> FilePath
        go []     = ""
        go [p]    = p
        go (p:ps) = p ++ "/" ++ go ps

-- split path on '/', erasing separator except at root
-- opposite of rejoinPath
breakPath :: FilePath -> [FilePath]
breakPath []    = []
breakPath (c:cs)
    | c == '/'  = "/" : go "" cs
    | otherwise = go [c] cs
    where
        go :: FilePath -> FilePath -> [FilePath]
        go z []         = [z]
        go z (c:cs)
            | c == '/'  = z : go "" cs
            | otherwise = go (z ++ [c]) cs

expandHome :: FilePath -> IO FilePath
expandHome p = rejoinPath <$> (go $ breakPath p)
    where
        go []           = pure []
        go (p:ps)
            | p == "~"  = do 
                            home <- getHomeDirectory
                            pure $ home : ps
            | otherwise = pure $ p : ps

我的理解是,getHomeDirectory 是从 HOME 环境变量中读取的,并且其他主目录将很难获得,但我希望并非不可能或非常困难。

注意

我目前只对linux系统感兴趣;我知道 Windows 和 Mac 的风格完全不同。

【问题讨论】:

  • 您的标准 Linux 发行版列出了 /etc/passwd 中的帐户和相应的主文件夹。

标签: haskell tilde-expansion


【解决方案1】:

看起来这可以在 unix 包中使用 getUserEntryForName 然后使用 UserEntryhomeDirectory 字段。

import System.Posix.User

main :: IO ()
main = do entry <- getUserEntryForName "djf"
          putStrLn (homeDirectory entry)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2022-12-14
    • 2020-12-06
    • 2011-12-16
    相关资源
    最近更新 更多