【发布时间】: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中的帐户和相应的主文件夹。