Сокращен ли текущий каталог в командной строке?


23

vim имеет действительно хорошую функцию, которую он использует в своих путях, когда они немного длинны:

введите описание изображения здесь

Сокращает путь к документу на вкладке вверху. Есть ли способ сделать что-то похожее на это, чтобы моя подсказка bash не выглядела так:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Итак, что вы хотите rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? В идеале, использовать какой-то порог для максимальной длины подсказки?
nicerobot

Именно это я и ищу.
Нафтули Кей

Хорошо, я предоставил свой ответ.
nicerobot

Ответы:


14

Попробуйте это :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

или, чистый bash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

тогда

PS1='\u@\h ${PS1X} $ '

производит (обратите внимание ~на ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Я улучшил свой ответ благодаря @ enzotib's


1
Можете ли вы привести пример того, как это будет выглядеть как приглашение для потомков?
Нафтули Кей

(0) Ваша ссылка на github не работает. (1) Возможно, вы захотите поближе взглянуть на $PWD~тест. В настоящее время, если HOMEесть /home/edи PWDесть /home/edwina, вы получаете ~winaв версии Perl и ~/inaв версии оболочки. (2) Ваш код оболочки дросселирует, если текущий каталог содержит какие-либо символы подстановки (то есть, расширение пути); например, PWD= /abc/*/def. Вы можете исправить это, добавив set -o noglobили set -f. … (Продолжение)
G-Man говорит: «Восстановите Монику»

(Продолжение)… (3) Вам не нужно почти столько скобок. В команде Perl, $HOME(которая находится внутри двойных кавычек) и $PWDдостаточно хороши. В команде оболочки, последние три ссылок переменной оболочки прекрасна, но первые три может быть "${PWD#$HOME}", "$PWD"и "$p". (4) См. Также ответ mbentley и мои комментарии к нему.
G-Man говорит: «Восстановите Монику»

15

Похоже на ответ @nicerobot, но несколько короче:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Это покажет следующий пример:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

Мне нравится PROMPT_DIRTRIMв Баш ...

export PROMPT_DIRTRIM=2

изменит пример вашего запроса на ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Меня устраивает.


Не делает то, что он просил, но спасибо, что сообщили мне об этой функции.
nicerobot

3
@nicerobot Да, у тебя был реальный ответ. :) Я знаю, что это не дает аббревиатуру, о которой он просил, но часто, когда мы видим простые варианты, наши ожидания меняются. Кроме того, это стандарт, и я чувствовал, что заслуживаю упоминания.
BentFX

1
Я чувствую, что одной из функций SE является не только предоставить идеальный ответ на вопрос, но и предоставить другие варианты для ОП и других, которые находят вопрос через поиск. Обратите внимание на контекст ответа, который я предоставил: «Мне нравится ... работает для меня». Тем не менее, некоторые считают, что это заслуживает отрицательного голосования.
BentFX

Я склонен к тому, чтобы проголосовали за ответы, которые не дают прямого ответа на вопрос, но я согласен с вами, что предоставление альтернатив может быть действительным ответом или ответом .
nicerobot

Ответ BentFX не отвечает на вопрос ОП в целом, а точно соответствует теме. Сокращен ли текущий каталог в приглашении оболочки? что, вероятно, для большинства посетителей этой темы именно то, что они ищут.
TNT

4

В дополнение к ответу энзотиба , следующий фрагмент будет:

  1. Преобразовать /Path/To/Your/Home/в ~/(поэтому путь будет ~/a/b/cвместо /P/T/Y/H/a/b/c)
  2. Используйте первую букву «точечного файла» вместо того, чтобы показывать только точку ( /a/./c/dстанет /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Убедитесь, что вы используете одинарные кавычки, иначе Bash преждевременно расширит его.


3

Формат для использования в PS1IS \W(см PROMPTINGраздел в справочной bashстранице).

PS1="\u@\h \W\$ "

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


2
Я думаю, что \ W вообще не делает то, что он просит.
nicerobot

1
@nicerobot Это не дает первый инициал каждого компонента пути, но это дает текущий рабочий каталог в более короткой манере. Я почти уверен, что таким образом сокращать каталог невозможно, не используя какой-то довольно уродливый скрипт, выполняющий каждое приглашение. Посмотрим, что он скажет по этому поводу.
Кевин

1

Мне нравится вывод из примера nicerobot, но я нашел одну проблему. У меня есть каталог, в котором есть дефис, A-Eи он рассматривался -Eкак аргумент, printfкогда это был мой текущий рабочий каталог. Чтобы исправить это, я добавил --к последним printfи добавил кавычки вокруг вывода на случай, если нечего выводить:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) Хороший улов в вопросе имени каталога, содержащего -в качестве второго символа. Хотя это правда, что --это общее решение вопроса об аргументах, начинающихся с -, лучше printfсказать метод printf "%s" "${q:1}", так как это также защищает от содержащихся аргументов %. (Например, попробуйте PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) См. Также мои комментарии к ответу nicerobot.
G-Man говорит: «Восстановите Монику»
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.