如何从 /home/user1/foo 获取 ~/foo?

如何从 /home/user1/foo 获取 ~/foo?

Bash 提示符支持\w转义序列,记录为

\w     the current working directory, with $HOME abbreviated
       with a tilde (uses the value of the PROMPT_DIRTRIM variable)

有没有办法获取任意字符串的类似缩写?也就是说,是否有一个通用命令可以执行类似以下操作,前提是 HOME=/home/user1

/home/user1         → ~
/home/user1/a/1     → ~/a/1
/home/user2/b/2     → ~user2/b/2
/root               → ~root

当然,我可以用 sed 尝试一些不太好用的东西,但无论如何这不太可能给我想要的结果。:-)

这背后的动机是我想使终端选项卡中的标题尽可能短,因此尽可能缩短工作目录。

更新:由于似乎没有一个令人满意的解决方案,而且我想让事情足够快,所以我现在采用了一个简单的

pwd | sed -e "s|/root|~root|" -e "s|/home/user1|~|

对于 root 来说也有类似的情况。由于我是机器上唯一的用户,所以目前这或多或少是可行的。我会保持这个问题开放,以防有人想出办法magical-tool-that-solves-all-problems(最好不要用 elisp 写出来……)。

答案1

对于当前用户和存储在名为的变量中的字符串DIR,这将起作用:${DIR/~/\~}

它将 的扩展名~(变量的值$HOME或当前用户的主目录)替换为文字~

答案2

对于您自己的主目录,使用dir="${PWD/#$HOME/~}"

若要/home/按照 Glenn 的建议剥离,也请使用dir="${dir/#\/home\//~}"


转换其他用户的主目录要复杂得多,因为你必须列出全部用户每次。

  • 你甚至不能在第一次匹配时就停下来,因为少数第一个帐户的主目录/总是匹配的。相反,需要检查最长前缀,这并不简单。

  • 我经常使用配置为从 LDAP 读取用户帐户的服务器,这需要一秒钟才能列出所有帐户;同时,Active Directory 甚至不允许查看整个列表。

相关内容