Показывать только текущее имя каталога (не полный путь) в приглашении bash

78537
hsribei

Способ, которым моя подсказка bash настроена в настоящее время, показывает полный путь к текущему каталогу. Это раздражает, когда я глубоко в дереве каталогов, так как приглашение становится настолько длинным, что каждая команда переносится в следующую строку. Как мне сделать так, чтобы он показывал только последнюю часть пути?

Вот что я имею в своем .bashrc:

PS1='$\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '  # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*) PROMPT_COMMAND='echo -ne "\033]0;$@$: $\007"' ;; *) ;; esac 
65

6 ответов на вопрос

85
quack quixote

Измените \w(нижний регистр) на \W(верхний регистр):

PS1='$\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ ' ^^ this one waaaaaay over here ------------------------------------------------+  

Загляните в Bash Prompt HOWTO, чтобы узнать больше интересных деталей. пример:

user@host:/usr/local/bin$ echo $PS1 $\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$   user@host:/usr/local/bin$ export PS1='$\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '  user@host:bin$ 

PROMPT_COMMANDПеременное, если установлена, является командой, которая получает запустить перед отображением строки, указанной в PS1. В вашем случае PROMPT_COMMANDвыполняется echoоператор с определенными escape-последовательностями ANSI, которые манипулируют заголовком Xterm .

Если вы подозреваете, что PROMPT_COMMANDваш PS1запрос переопределен, вы можете unsetпроверить его и проверить:

$ unset PROMPT_COMMAND 

Наконец, убедитесь, что вы меняете PS1определение, которое фактически используется. Общие места являются /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. Системные файлы обычно (но не всегда) запускаются перед пользовательскими файлами.

Хм ... Боюсь, что это уже \ w, но похоже, что оператор `case` переопределяет его, когда я нахожусь на xterm, и проблема, похоже, связана с` PWD` в строке `PROMPT_COMMAND`. Вы знаете, что я должен положить туда? hsribei 15 лет назад 0
`\ w` (нижний регистр) устанавливает его в полный путь,` \ W` (верхний регистр) обрезает последний бит. PROMPT_COMMAND устанавливает заголовок окна в xterm. проверьте переменную TERM; если он не * начинается * с "xterm" или "rxvt", то PROMPT_COMMAND даже не запускается. quack quixote 15 лет назад 4
О да, да. Извините, я смешал прописные и строчные буквы. Это сработало. Спасибо! :) hsribei 15 лет назад 0
Отличный ответ. Убедитесь, что вы перезагрузитесь, чтобы это вступило в силу. Спасибо! Combine 6 лет назад 0
11
stopBugs

Simple bash replace command is

$ 

For showing the last directory you can just do $, i.e. find any thing before and including the last '/' and replace it with nothing.

On my ubuntu machine I use:

export PS1='$(whoami):$#'. 
Только шесть лет опоздал! Burgi 8 лет назад 5
Мне нравится этот ответ лучше, чем принятый, потому что он является общим для любой ситуации, а не просто специальной логикой синтаксического анализа $ PS1. Меньше более мощных инструментов легче запомнить и составить. :) David Ellis 6 лет назад 0
3
Michael Durrant

Мое решение состоит в том, чтобы показать три верхних и два нижних каталога, когда их более 5

Так что моя подсказка (в которой есть и другая информация) выглядит так:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote 

когда мой pwd на самом деле

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote 

Моя подсказка PS1 настроена следующим образом:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST TIME='\[\033[01;31m\]\t \[\033[01;32m\]' LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\/[^/]\/[^/]\/\).*\(/[^/]\/[^/]\\)/\#\1_\2#g"`' BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ ' PS1=$TIME$USER$HOST$LOCATION$BRANCH 

git_branch это функция, которая показывает текущую ветку git, я храню ее в своих точечных файлах, это:

git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' } 
2
U-ways

Мое решение для этого немного отличается в отношении того, как я могу его экспортировать, поэтому я поделился этим здесь:

Создайте другую строковую переменную подсказки; PS5 и экспортируйте следующую строку в ваш .profile/ .bash_profileфайл:

\ u : Показать текущее имя пользователя.

\ W : Распечатать базу текущего рабочего каталога.

# Display username and current directory only. export PS5='export PS1="\u:\W$";'; 

Теперь, когда вам нужно использовать сокращенное PS, просто запустите: eval $PS5


Или еще лучше, создайте псевдоним в вашем .bash_aliasesфайле: (спасибо @muru )

alias PS5='export PS1="\u:\W$";'; 

sourceснова, и теперь вы можете просто напечатать PS5для переключения.

Это похоже на frankenalias. Почему бы просто не использовать псевдоним или функцию? muru 6 лет назад 1
@muru Спасибо, это намного лучше, ответ обновлен. U-ways 6 лет назад 0
1
Gray

Показывать только текущее имя каталога (не полный путь) в приглашении bash

Большинство других решений не работали для меня во всех моих ОС, которые используют мои точечные файлы: AIX, Windoze и Linux. Порты Баш были старые версии, которые не поддерживают определенные конструкции, и я не хочу, чтобы отвалить другой процесс (то есть sed, awkи т.д.), которая заметно дороже под Cygwin.

Следующее долго, но производительно:

# takes a number argument of the number of last dirs to show function DIR_LAST { # read -a didn't seem to work under bash 3 IFS='/' array=($PWD) len=${#array[@]} start=$((len - $1)) # leading / if fewer dir args: /usr/flastname not usr/flastname if (( $start <= 1 )); then start=1 echo -n / fi for (( i = $start; $i < $len; i++ )); do if (( $i > $start )); then echo -n / fi echo -n $ done } export PS1="\$(DIR_LAST 2) {$(hostname)} " 

Хочу выплюнуть

/ /usr /usr/foo foo/bin 

Обратите внимание на отсутствие косой черты в последней строке, как мне нравится. Кроме того, вы можете выплюнуть последние 3 каталога, изменив arg на DIR_LAST.

Кроме того, я пытался сделать это с помощью регулярных выражений, BASH_REMATCHно bash v3, похоже, не нравился паренам, и я не мог понять, как правильно их избежать. Вздох.

0
Mean Developr

Я считаю, что этот вариант намного проще, просто сделав:

echo $PWD | rev | cut -d '/' -f 1 | rev 

Поэтому присвойте это переменной PS1 в вашем файле .bashrc:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)' 

Похожие вопросы