Как получить ~/foo из /home/user1/foo?
Приглашение Bash поддерживает \w
escape-последовательность, задокументированная как
\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…).
2 ответа
Для текущего пользователя и строки, хранящейся в переменной с именем DIR
, это будет работать: ${DIR/~/\~}
Это заменяет расширение ~
, который является либо значением $HOME
переменная или домашний каталог текущего пользователя, с литералом ~
,
Для собственного домашнего каталога используйте dir="${PWD/#$HOME/~}"
,
Просто раздеться /home/
как предполагает Гленн, также используйте dir="${dir/#\/home\//~}"
,
Конвертировать домашние каталоги других пользователей намного сложнее, так как вам нужно каждый раз перечислять всех пользователей.
Вы даже не можете остановиться на первом матче, так как несколько первых аккаунтов имеют домашний каталог
/
который всегда будет совпадать. Вместо этого необходимо проверить самый длинный префикс, который не прост.Я часто работаю с серверами, настроенными на чтение учетных записей пользователей из LDAP, что занимает целую секунду, чтобы вывести список всех учетных записей; Между тем, Active Directory даже не позволит увидеть весь список.