Tampilkan hanya nama direktori saat ini (bukan path lengkap) pada bash prompt

71

Cara bash prompt saya saat ini dikonfigurasi, itu menunjukkan seluruh path ke direktori saat ini. Ini menjengkelkan ketika saya jauh di dalam pohon direktori, karena prompt menjadi begitu panjang sehingga setiap perintah masuk ke baris berikutnya. Bagaimana cara membuatnya hanya menampilkan bagian terakhir dari jalan?

Inilah yang saya miliki di .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
hsribei
sumber

Jawaban:

98

Ubah \w(huruf kecil) menjadi \W(huruf besar):

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

Lihatlah Bash Prompt HOWTO untuk mendapatkan banyak detail menyenangkan. contoh:

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_COMMANDvariabel, jika diatur, adalah perintah yang akan dijalankan sebelum menampilkan prompt ditentukan dalam PS1. Dalam kasus Anda, PROMPT_COMMANDjalankan echopernyataan dengan urutan pelarian ANSI tertentu yang memanipulasi batang judul suatu Xterm .

Jika Anda mencurigai bahwa Anda PROMPT_COMMANDmengabaikan permintaan Anda PS1, Anda dapat unsetmelakukannya dan menguji berbagai hal:

$ unset PROMPT_COMMAND

Akhirnya, pastikan Anda mengubah PS1definisi yang benar-benar digunakan. Lokasi umum adalah /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. File sistem umumnya (tetapi tidak selalu) dijalankan sebelum file pengguna.

quack quixote
sumber
Hm ... Saya khawatir ini sudah, tetapi sepertinya casepernyataan itu menimpanya ketika saya menggunakan xterm, dan masalahnya sepertinya ada PWDpada PROMPT_COMMANDbaris tersebut. Apakah Anda tahu apa yang harus saya taruh di sana?
hsribei
4
\w(huruf kecil) mengaturnya ke jalur penuh, \W(huruf besar) memotong ke bit terakhir. PROMPT_COMMAND sedang mengatur judul jendela dalam xterm. periksa variabel TERM Anda; jika tidak dimulai dengan "xterm" atau "rxvt" maka PROMPT_COMMAND bahkan tidak dijalankan.
quack quixote
Oh ya, ya. Maaf, saya mencampur huruf besar dan kecil. Itu berhasil. Terima kasih! :)
hsribei
Jawaban yang bagus Pastikan Anda me-reboot agar ini berlaku. Terima kasih!
Gabungkan
14

Perintah simple bash replace adalah

${VAR/pattern_to_find/pattern_to_replace}

Untuk menunjukkan direktori terakhir yang bisa Anda lakukan ${PWD/*\//}, yaitu menemukan sesuatu sebelum dan termasuk yang terakhir ' /' dan menggantinya dengan apa-apa.

Di mesin ubuntu saya, saya menggunakan:

export PS1='$(whoami):${PWD/*\//}#'. 
stopBugs
sumber
1
Saya suka jawaban ini lebih baik daripada yang diterima karena ini generik untuk situasi apa pun, bukan hanya logika parsing khusus $ PS1. Lebih sedikit alat yang lebih kuat lebih mudah diingat dan dikomposisi. :)
David Ellis
4

Solusi saya adalah menampilkan tiga direktori teratas dan terbawah 2 ketika ada lebih dari 5

Jadi prompt saya (yang memiliki info lain juga) terlihat seperti:

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

ketika pwd saya sebenarnya

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

Prompt PS1 saya diatur sebagai berikut:

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 adalah fungsi yang menunjukkan cabang git saat ini, saya menyimpannya di dotfiles saya, yaitu:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }
Michael Durrant
sumber
Ini luar biasa! Terima kasih banyak atas jawaban ini.
Carlos F
4

Solusi saya untuk ini sedikit berbeda dalam hal bagaimana saya mengekspornya, jadi saya pikir saya akan membagikannya di sini:

Buat variabel string prompt lainnya; PS5 dan ekspor string berikut di Anda .profile/ .bash_profileberkas:

\ u : Tampilkan nama pengguna saat ini.

\ W : Cetak dasar direktori kerja saat ini.

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

Sekarang, setiap kali Anda perlu menggunakan PS singkatan kata, jalankan: eval $PS5


Atau bahkan lebih baik lagi, buat alias di .bash_aliasesfile Anda : (terima kasih ke @muru )

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

sourcelagi, dan sekarang Anda bisa mengetik PS5untuk beralih.

U-cara
sumber
1
Ini terlihat seperti frankenalias. Mengapa tidak menggunakan alias atau fungsi saja?
muru
1

Tampilkan hanya nama direktori saat ini (bukan path lengkap) pada bash prompt

Sebagian besar solusi lain tidak bekerja untuk saya di semua OS saya yang berbagi file dot saya: AIX, Windoze, dan Linux. Port pesta yang versi lama yang tidak mendukung konstruksi tertentu dan saya tidak ingin garpu proses lain (yaitu sed, awk, dll) yang terasa mahal di bawah cygwin.

Berikut ini panjang tapi performan:

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

Saya ingin meludahkan:

/
/usr
/usr/foo
foo/bin

Perhatikan kurangnya garis miring di baris terakhir yang saya suka. Juga, Anda dapat memuntahkan 3 direktori terakhir dengan mengubah arg ke DIR_LAST.

Juga, saya mencoba melakukan ini dengan regex dan BASH_REMATCHtetapi bash v3 tampaknya tidak menyukai parens dan saya tidak tahu cara melarikan diri dengan benar. Mendesah.

Abu-abu
sumber
0

Saya percaya opsi ini jauh lebih mudah, hanya dengan melakukan:

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

Jadi tetapkan ini ke variabel PS1 dalam file .bashrc Anda:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'
Dani Mach
sumber
0
root:~/project#  -> root:~/project(dev)# 

tambahkan kode berikut ke akhir ~ / .bashrc Anda

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
Ali Alp
sumber