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 甚至不允许查看整个列表。