Показывать только текущее имя каталога (не полный путь) в приглашении 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)", чтобы показывать только имя текущей папки, а не весь путь.