Bash isteminde yalnızca geçerli dizin adını (tam yol değil) göster


71

Bash istemimin şu anda yapılandırıldığı şekilde, geçerli dizine giden tüm yolu gösterir. Her komut bir sonraki satıra saracak kadar uzadığı için, bir dizin ağacının derinliklerinde olduğumda bu can sıkıcı bir durum. Yolun yalnızca son kısmını göstermesini nasıl sağlayabilirim?

Bu benim içinde ne var .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

Yanıtlar:


98

Değişim \wiçin (küçük harf) \W(büyük harf):

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

Pek çok eğlenceli ayrıntı için Bash Prompt NASIL belgesine bir göz atın . örnek:

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_COMMANDDeğişken, ayarlarsanız, belirtilen istemini görüntülemeden önce koþulur bir komuttur PS1. Senin durumunda, bir Xterm'in başlık çubuğunu değiştiren belirli ANSI kaçış dizileri olan PROMPT_COMMANDbir echoifade çalıştırıyor .

Sizden isteminizi PROMPT_COMMANDgeçersiz kıldığından şüpheleniyorsanız PS1, unsetbunu test edip deneyebilirsiniz :

$ unset PROMPT_COMMAND

Son olarak, PS1gerçekte kullanılan tanımı değiştirdiğinizden emin olun . Yaygın yerlerdir /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. Sistem dosyaları genellikle (ancak her zaman değil) kullanıcı dosyalarından önce çalıştırılır.


Hmm ... Ben zaten w \ korkuyorum, ama bu gibi görünüyor casei xterm üzerinde olduğumda açıklamada bunu bastıran ve sorun ile görünmektedir PWDiçinde PROMPT_COMMANDhat. Oraya ne koymam gerektiğini biliyor musun?
hsribei

4
\w(küçük harf) onu tam yola ayarlar, \W(büyük harf) son biti keser. PROMPT_COMMAND, pencere başlığını xterm olarak ayarlıyor. TERM değişkeninizi kontrol edin; o olmazsa başlamak ardından "xterm" veya "rxvt" ile PROMPT_COMMAND bile çalıştırmak almıyor.
quack quixote

Ah evet. Üzgünüm, büyük ve küçük harf karıştırdım. İşe yaradı. Teşekkürler! :)
hsribei

Mükemmel cevap. Bunun etkili olması için yeniden başlattığınızdan emin olun. Teşekkürler!
birleştirme

14

Basit bash değiştirme komutu

${VAR/pattern_to_find/pattern_to_replace}

Son dizini göstermek için yapabileceğiniz ${PWD/*\//}, yani son ' /' ifadesinden önce ve sonra herhangi bir şeyi bulun ve hiçbir şey ile değiştirin.

Ubuntu makinemde kullanıyorum:

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

1
Bu cevabı kabul edilen cevaptan daha çok seviyorum çünkü sadece $ PS1'in özel ayrıştırma mantığı yerine her duruma genel. Daha az sayıda daha güçlü araçların hatırlanması ve oluşturulması daha kolaydır. :)
David Ellis,

4

Benim çözümüm, 5'ten fazla olduğunda ilk üç ve alt 2 dizini göstermektir.

Bu yüzden benim istemi (diğer bilgileri de var) şöyle görünüyor:

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

benim pwd aslında olduğunda

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

Benim PS1 istemim aşağıdaki gibidir:

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 Geçerli git dalını gösteren bir işlev, onu nokta dosyalarımda tutuyorum.

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

Bu harika! Bu cevap için çok teşekkür ederim.
Carlos F,

4

Bunun için çözümüm onu ​​nasıl ihraç edeceğim konusunda biraz farklı, bu yüzden burada paylaşacağımı düşündüm:

Başka bir bilgi istemi dizesi değişkeni yaratın; PS5 ve aşağıdaki dizeyi ihracat .profile/ .bash_profiledosyaya:

\ u : Geçerli kullanıcı adını göster.

\ W : Geçerli çalışma dizininin tabanını yazdır.

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

Şimdi stenografi PS'yi ne zaman kullanmanız gerektiğine bakalım, sadece koşun: eval $PS5


Ya da daha iyisi, .bash_aliasesdosyanızda bir takma ad oluşturun : ( @muru sayesinde )

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

sourcetekrar, ve şimdi sadece değiştirmek için yazabilirsiniz PS5.


1
Bu bir frankenalias gibi görünüyor. Neden sadece bir takma ad veya işlev kullanmıyorsunuz?
muru

1

Bash isteminde yalnızca geçerli dizin adını (tam yol değil) göster

Diğer çözümlerin çoğu, benim nokta dosyalarımı paylaşan tüm işletim sistemimde işe yaramadı: AIX, Windoze ve Linux. Bash portları belirli yapıları destek vermedi eski versiyonları vardı ve ben başka bir işlem (yani çatal istemiyordu sed, awkcygwin altında belirgin pahalı, vs.).

Aşağıdaki uzun ama performans:

# 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)} "

Tükürmesini istiyorum.

/
/usr
/usr/foo
foo/bin

Son satırda önde gelen eğik çizgi olmamasına dikkat edin. Ayrıca, argümanı değiştirerek son 3 dizini tükürebilirsiniz DIR_LAST.

Ayrıca, bunu bir regex ile yapmaya çalıştım BASH_REMATCHama bash v3 parens gibi gözükmüyordu ve onlardan nasıl düzgün şekilde kaçılacağını çözemedim. İç çekmek.


0

Bu seçeneğin çok kolay olduğuna inanıyorum:

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

Bu yüzden bunu .bashrc dosyanızdaki PS1 değişkenine atayın:

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

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

~ / .bashrc'nizin sonuna aşağıdaki kodu ekleyin

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.