Как получить ~/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 даже не позволит увидеть весь список.

Другие вопросы по тегам