ZSH
В zsh
это может быть достигнуто полностью с помощью встроенных функций.Вам просто нужно поместить
%(4/|../%3d|%d)
в свой параметр PROMPT
(также известный как PS1
).
Например:
PROMPT='[%m@%n %(4/|../%3d|%d)]%# '
Получит васчто-то вроде
[abc@machine ../c/Users/test]%
, когда текущим каталогом является /home/abc/c/Users/test
.
Объяснение:
%(x|true-text|false-text)
: x
представляет тест, если он оценивается как true , он zsh
напечатает то, что помещено как true-text , иначе он напечатает false-text . 4/
равно true , если текущий абсолютный путь содержит как минимум 4 элемента.Например, /home/abc/c/Users/test
имеет 5 элементов - Таким образом, если текущий путь имеет 4 или более элементов, выходной сигнал будет
../%3d
, где %3d
будет заменен последними 3 элементами текущего пути.Например, ../c/Users/test
. - Если текущий путь содержит менее 4 элементов, выходной сигнал будет
%d
, который будет заменен полным текущим путем.
BASH
Метод 1: простое, но не идеальное совпадение
В bash
(начиная с версии 4) вы можете добиться очень похожих результатов, установив PROMPT_DIRTRIM=3
и поместив \w
в PS1
.Это также будет отображать только последние 3 элемента текущего пути, перед которыми стоит ~/.../
или .../
.Что зависит от того, находится ли текущий каталог в домашнем каталоге пользователя.
Например:
PS1='[\u@\h \w]\$ '
PROMPT_DIRTRIM=3
даст вам
[abc@machine ~/.../c/Users/test]$
, если текущий рабочий каталог равен /home/abc/c/Users/test
и
[abc@machine .../share/doc/sometool]$
, когдатекущий рабочий каталог /usr/local/share/doc/sometool
.
Метод 2: сложный, но работает в соответствии с запросом
Для точного соответствия укажите в вашем PS1
:
$(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})
Например,
PS1='[\u@\h $(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})]\$ '
Важно: По крайней мере часть, которая генерирует выходной путь, должна быть полностью заключена в кавычки, например, заключена в одинарные кавычки.В противном случае он будет оцениваться во время определения, а не при отображении подсказки.
Объяснение:
$(command)
: это называется Подстановка команд .Он будет работать command
и затем будет заменен полученным результатом. - Параметр
PWD
содержит текущий рабочий каталог. a=${PWD%/*}
: Наименьшее возможное совпадение с /*
будет удалено с конца $PWD
, а результирующее значение будет присвоено параметру a
.То есть последний элемент пути будет удален из $PWD
. a=${PWD%/*} a=${a%/*} a=${a%/*}
: это удалит последние три элемента пути из $PWD
.Если $PWD
имеет три или менее элементов, то a
будет пустым в конце.Если имеется более трех элементов, то a
содержит все элементы, которые вы не хотите показывать, то есть те, которые вы хотите заменить на ..
.
( Примечание : хотя a=${PWD%/*/*/*}
также удаляет последние три элемента пути, он не работает должным образом, если имеется менее трех элементов. В этом случае конец $PWD
не будет соответствовать /*/*/*
и ничего не будет удалено, оставляя $a
идентичным $PWD
.)
${a:+..}
: если определено a
и не равно null, то этобудет заменен на ..
, в противном случае ничего не будет заменено.Это означает, что если есть элементы пути, которые необходимо удалить, ${a:+..}
будет иметь значение ..
. ${PWD/#$a/${a:+..}})
: если начало $PWD
соответствует $a
, то оно будет заменено наподстановка ${a:+..}
.По сути, если a
содержит какие-либо элементы пути, они будут заменены на ..
, иначе ничего не изменится. echo
: поскольку все это происходит в Подстановке команд , echo
необходим для вывода сокращенного пути.