Показувати лише поточне ім'я каталогу (не повний шлях) у рядку bash


65

Як зараз налаштовано мою підказку 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

Відповіді:


86

Змінити \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$

The 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. Системні файли зазвичай (але не завжди) виконуються перед користувачами.


Хм ... боюся, що це вже є, але здається таким case оператор перекриває його, коли я на xterm, і проблема, здається, з PWD в PROMPT_COMMAND лінії. Чи знаєте ви, що я повинен там поставити?
hsribei

4
\w (нижній регістр) встановлює його на повний шлях, \W (у верхньому регістрі) до кінцевого біта. PROMPT_COMMAND встановлює заголовок вікна у xterm. перевірте вашу змінну TERM; якщо це не так початок з "xterm" або "rxvt" тоді PROMPT_COMMAND навіть не запускається.
quack quixote

О, так, так. На жаль, я змішав верхній і нижній регістри. Це спрацювало. Дякую! :)
hsribei

Чудова відповідь. Переконайтеся, що ви перезавантажилися, щоб це набрало чинності. Дякую!
Combine

11

Простий командою bash заміни

${VAR/pattern_to_find/pattern_to_replace}

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

На моїй машині Ubuntu я використовую:

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

5
Запізнюється лише шість років!
Burgi

Мені подобається ця відповідь краще, ніж прийнята, тому що вона є загальною для будь-якої ситуації замість спеціальної логіки $ PS1. Менше потужних інструментів легше запам'ятати і скласти. :)
David Ellis

3

Моє рішення полягає в тому, щоб показати верхню і нижню 2 каталоги, коли є більше ніж 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, я зберігаю її в своїх dotfiles, це:

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

2

Моє рішення для цього трохи відрізняється від того, як експортувати його, тому подумав би я поділитися тут:

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

u : Відображення поточного імені користувача.

W : Друк бази поточного робочого каталогу.

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

Тепер, коли потрібно використовувати скорочений PS, просто запустіть: eval $PS5


Або ще краще створити псевдонім у своєму .bash_aliases file: (завдяки @muru )

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

source знову, і тепер ви можете просто ввести PS5 для перемикання.


1
Це виглядає як frankenalias. Чому не просто використовувати псевдонім або функцію?
muru

@muru Спасибо, це набагато краще, відповідь оновлена.
U-ways

1

Показувати лише поточне ім'я каталогу (не повний шлях) у рядку 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 ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

Я хочу, щоб це виплюнуло:

/
/usr
/usr/foo
foo/bin

Зверніть увагу на відсутність провідної косої риси в останньому рядку. Крім того, ви можете виплюнути останні три каталоги, змінивши аргумент на DIR_LAST.

Крім того, я спробував зробити це за допомогою регулярного виразу і BASH_REMATCH але bash v3 не здавався любити parens та я не міг рахувати як правильно уникнути їх. Зітхання.


0

Я вважаю, що цей варіант набагато простіший:

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

Отже, призначте це для змінної PS1 у вашому файлі .bashrc:

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

0
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.