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

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

Это то, что у меня есть в моем .bashrc:

PS1='${debian_chroot:+($debian_chroot)}\[\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;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

8 ответов

Решение

Изменить \w (строчные) \W (верхний регистр):

PS1='${debian_chroot:+($debian_chroot)}\[\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
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

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

Если вы подозреваете ваш PROMPT_COMMAND переопределяет ваш PS1 подскажите, можете unset это и проверить вещи:

$ unset PROMPT_COMMAND

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

Простая команда замены bash

${VAR/pattern_to_find/pattern_to_replace}

Для отображения последнего каталога вы можете просто сделать ${PWD/*\//}то есть найти что-то до и включая последнее/и заменить его ничем.

На моей машине с Ubuntu я использую:

export PS1='$(whoami):${PWD/*\//}#'. 

Мое решение состоит в том, чтобы показать три верхних и два нижних каталога, когда их более 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,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\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/'
  }

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

Создайте другую строковую переменную подсказки; 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 переключать.

export PS1="\[\e[32m\]\u@\h \[\e[37m\]\W \[\e[32m\]$"

Поместите указанную выше строку в конец ~/.bashrc, и все должно пройти хорошо. Это сохранит цвет и сохранит красивый вид.

32м -> зеленый

37м -> белый

root:~/project#  -> root:~/project(dev)# 

добавьте следующий код в конец вашего ~/.bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt

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

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

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

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

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

Большинство других решений не работали для меня во всех моих ОС, которые используют мои точечные файлы: AIX, Windoze и Linux. Порты bash были старыми версиями, которые не поддерживали определенные конструкции, и я не хотел разворачивать другой процесс (т.е. 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 ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

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

/
/usr
/usr/foo
foo/bin

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

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

Вот замечательный маленький инструмент, который предоставляет интерфейс перетаскивания для создания собственной подсказки bash, которую вы можете просто скопировать в ваш.bashrc. Используйте элемент "Directory (basename)", чтобы показывать только имя текущей папки, а не весь путь.

Другие вопросы по тегам