Вопрос или проблема
Предположим, я делаю много работы в каталоге /home/user/documents/foo
, поэтому в приглашении Bash shell может отображаться следующее:
user@hostname: ~/documents/foo/bar/baz $
Мой терминал довольно узкий, и ~/documents/foo
не является полезным использованием пространства, так как я уже знаю, что нахожусь там.
Поэтому я хотел бы, чтобы в приглашении shell отображался рабочий каталог относительно /home/user/documents/foo
:
user@hostname: bar/baz $
Приглашение определяется переменной окружения PS1
, и я могу найти способы редактирования этого, чтобы включить путь относительно домашнего каталога моего пользователя или включить только базовое имя, но я не могу получить путь относительно другого каталога.
Из руководства bash
:
PROMPT_DIRTRIM
Если установлено значение больше нуля, оно используется как количество конечных компонентов каталога, которые сохраняются при расширении экранирования строки приглашения\w
и\W
(см. PROMPTING ниже). Удаленные символы заменяются на многоточие.
Если ваша строка приглашения (PS1
) использует \w
или \W
, вы можете захотеть использовать PROMPT_DIRTRIM=2
.
myself@myhost:~$ echo $PS1
${debian_chroot:+($debian_chroot)}\u@\h:\w\$
myself@myhost:~$ mkdir -p a/b/c/d/e
myself@myhost:~$ cd a/b/c/d/e/
myself@myhost:~/a/b/c/d/e$
myself@myhost:~/a/b/c/d/e$ PROMPT_DIRTRIM=2
myself@myhost:~/.../d/e$
Ответ или решение
Для решения задачи, связанной с оптимизацией места в командной строке в Bash-подсказке, мы можем воспользоваться возможностями Bash для динамического изменения отображаемого маршрута относительно заданного директорий. Давайте разберем теоретическую часть, приведем пример и обсудим практическое применение.
Теория
Bash предоставляет множество возможностей для настройки отображения командной строки. Основной переменной, используемой для этой цели, является PS1
, которая отвечает за форматирование приглашения (prompt). По умолчанию, часто используется последовательность \w
, которая отображает полный текущий рабочий каталог. Однако, чтобы отобразить каталог относительно другой, фиксированной, директории, нам потребуется немного поработать с Bash-скриптингом.
Изменение PS1
Чтобы изменить PS1
так, чтобы оно отображало путь относительно определенной директории, нам необходимо:
- Определить базовую директорию, относительно которой будет происходить вычисление.
- Использовать команды и синтаксис Bash для извлечения "относительного" пути.
- Внедрить созданную логику в строку
PS1
.
Основные команды
pwd
: Используется для получения текущего рабочего каталога.sed
: Утилита для обработки текста, которую можно использовать для замены части пути.export
: Инициализирует или изменяет переменные окружения, напримерPS1
.
Пример
Допустим, наша базовая директория — /home/user/documents/foo
. Наша задача — вывести путь относительно этой директории. Если текущий путь — /home/user/documents/foo/bar/baz
, то мы должны получить только bar/baz
.
# Установите базовую директорию
BASE_DIR="/home/user/documents/foo"
# Функция для вычисления относительного пути
rel_path() {
local current_dir=$(pwd)
echo $current_dir | sed "s|^$BASE_DIR/||"
}
# Измените PS1, чтобы использовать вычисленный относительный путь
export PS1='\u@\h: $(rel_path) \$ '
В этом примере используется функция rel_path
, которая исключает базовую директорию из полного пути, оставляя только необходимый "относительный" путь.
Применение
Данный подход может быть полезен, когда у вас есть фиксированное дерево директорий, в котором вы постоянно работаете, и вам не нужно видеть избыточные части пути. Это также помогает экономить место в терминале, особенно если он имеет ограниченную ширину.
Конфигурация и подводные камни
-
Установка в профиль: Для постоянного использования добавьте указанный выше код в ваш файл конфигурации
~/.bashrc
. Это позволит автоматически применять настройки при каждом запуске терминала. -
Потенциальные проблемы: Убедитесь, что ваша базовая директория точно указана в переменной
BASE_DIR
. Любая ошибка может привести к неожиданному отображению путей. -
Совместимость: Скрипт совместим только с Bash. Для других шеллов могут потребоваться адаптации.
Альтернативы
Хотя предложенный способ функционален, существуют и другие методы, например, использование сторонних утилит и плагинов для настройки оболочки. Однако использованием встроенных функций Bash вы получаете легковесное и быстрое решение.
Заключение
Настройка командной строки для отображения относительных путей может значительно улучшить читаемость и эффективность работы в терминале, особенно когда вы часто работаете в глубоко вложенных структурах директорий. Благодаря использованию встроенных возможностей Bash и простым средствам обработки строк, абсолютно реально создать профессионально выглядит и функциональное окружение терминала, не прибегая к сложным или не встроенным решениям.