Приглашение Bash поддерживает escape-последовательность \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…).

2 ответа2

2

Для вашего собственного домашнего каталога используйте dir="${PWD/#$HOME/~}".

Чтобы просто удалить /home/ как предлагает glenn, также используйте dir="${dir/#\/home\//~}" .


Конвертировать домашние каталоги других пользователей намного сложнее, так как вам нужно каждый раз перечислять всех пользователей.

  • Вы даже не можете остановиться на первом матче, так как несколько первых аккаунтов имеют домашний каталог / который всегда будет совпадать. Вместо этого необходимо проверить самый длинный префикс, который не прост.

  • Я часто работаю с серверами, настроенными на чтение учетных записей пользователей из LDAP, что занимает целую секунду, чтобы вывести список всех учетных записей; Между тем, Active Directory даже не позволит увидеть весь список.

1

Для текущего пользователя и строки, хранящейся в переменной с именем DIR , это будет работать: ${DIR/~/\~}

Он заменяет расширение ~ , которое является либо значением переменной $HOME либо домашним каталогом текущего пользователя, на литерал ~ .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .