बैश प्रॉम्प्ट पर केवल वर्तमान निर्देशिका नाम (पूर्ण पथ नहीं) दिखाएं


71

वर्तमान में मेरे बैश प्रॉम्प्ट को जिस तरह से कॉन्फ़िगर किया गया है, वह वर्तमान निर्देशिका के लिए पूरा रास्ता दिखाता है। जब मैं एक डायरेक्टरी ट्री के अंदर गहरी होती हूं तो यह कष्टप्रद होता है, क्योंकि प्रॉम्प्ट इतना लंबा हो जाता है कि हर कमांड अगली लाइन में आ जाता है। मैं इसे केवल पथ का अंतिम भाग कैसे दिखा सकता हूँ?

यह मेरे पास है .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

जवाबों:


98

\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 ------------------------------------------------+    

बहुत सारे मज़ेदार विवरणों के लिए बैश प्रॉम्प्ट 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कुछ के साथ बयान एएनएसआई भागने दृश्यों कि एक xterm की शीर्षक पट्टी में हेरफेर

यदि आपको संदेह है कि आपका संकेत PROMPT_COMMANDआपके ओवरराइड PS1कर unsetरहा है , तो आप इसे कर सकते हैं और चीजों का परीक्षण कर सकते हैं:

$ unset PROMPT_COMMAND

अंत में, सुनिश्चित करें कि आप उस PS1परिभाषा को बदल रहे हैं जो वास्तव में उपयोग की जाती है। आम ऐसे स्थान होते हैं /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile। सिस्टम फाइलें आम तौर पर (लेकिन हमेशा नहीं) उपयोगकर्ता फाइलों से पहले चलती हैं।


हम्म ... मुझे डर है कि यह पहले से ही \ w है हूँ, लेकिन ऐसा लगता है कि जैसे caseबयान यह ओवरराइड करता है जब मैं एक xterm पर हूँ, और समस्या के साथ हो रहा है PWDमें PROMPT_COMMANDलाइन। क्या आप जानते हैं कि मुझे क्या करना चाहिए?
२२:४

4
\w(निचला मामला) इसे पूर्ण पथ पर सेट करता है, \W(अपरकेस) अंतिम बिट को ट्रिम करता है। PROMPT_COMMAND एक xterm में विंडो शीर्षक सेट कर रहा है। अपने TERM चर की जाँच करें; यदि यह "xterm" या "rxvt" से शुरू नहीं होता है , तो PROMPT_COMMAND भी नहीं चल रहा है।
क्विकोट क्विकोट

ओह, हाँ, दुआ। क्षमा करें, मैंने ऊपरी और निचले हिस्से को मिलाया। वह काम किया। धन्यवाद! :)
hsribei

बहुत बढ़िया जवाब। सुनिश्चित करें कि आप इसे प्रभावी बनाने के लिए रीबूट करें। धन्यवाद!
मिलाएं

14

साधारण बैश रिप्लेसमेंट कमांड है

${VAR/pattern_to_find/pattern_to_replace}

अंतिम निर्देशिका दिखाने के लिए ${PWD/*\//}, आप बस कर सकते हैं , अर्थात किसी भी चीज़ को पहले और अंतिम ' /' सहित ' ' को खोजें और उसे कुछ भी न बदलें।

मेरे ubuntu मशीन पर मैं का उपयोग करें:

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

1
मुझे यह उत्तर स्वीकार किए गए से बेहतर लगता है क्योंकि यह $ PS1 के विशेष पार्सिंग तर्क के बजाय किसी भी स्थिति के लिए सामान्य है। कम शक्तिशाली उपकरण याद रखने और बनाने में आसान होते हैं। :)
डेविड एलिस

4

5 से अधिक होने पर शीर्ष तीन और निचले 2 निर्देशिकाओं को दिखाने के लिए मेरा समाधान है

तो मेरा संकेत (जिसमें अन्य जानकारी भी है) ऐसा दिखता है:

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_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

यह कमाल का है! इस उत्तर के लिए बहुत बहुत धन्यवाद।
कार्लोस एफ

4

इसके लिए मेरा समाधान थोड़ा अलग है कि मैं इसे कैसे निर्यात करता हूं, इसलिए मैंने सोचा कि मैं इसे यहां साझा करूंगा:

एक और शीघ्र स्ट्रिंग चर बनाएं; 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स्विच करने के लिए टाइप कर सकते हैं ।


1
यह एक फ्रेंकलिन की तरह दिखता है। सिर्फ एक उपनाम या एक फ़ंक्शन का उपयोग क्यों न करें?
मुरु

1

बैश प्रॉम्प्ट पर केवल वर्तमान निर्देशिका नाम (पूर्ण पथ नहीं) दिखाएं

अन्य सभी समाधानों ने मेरे सभी ओएस के लिए काम नहीं किया, जो मेरी डॉट फाइलें साझा करते हैं: एआईएक्स, विंडोज, और लिनक्स। बैश पोर्ट पुराने संस्करण थे जो कुछ निर्माणों का समर्थन नहीं करते थे और मैं एक और प्रक्रिया (यानी , आदि) को कांटा नहीं करना चाहता था sed, awkजो कि साइबरविन के तहत काफी महंगा है।

निम्नलिखित लंबा है, लेकिन प्रदर्शनकारी है:

# 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

अंतिम पंक्ति में एक प्रमुख स्लैश की कमी को नोटिस करें कि मुझे यह कैसे पसंद है। इसके अलावा, आप arg को बदलकर अंतिम 3 निर्देशिकाओं को थूक सकते हैं DIR_LAST

इसके अलावा, मैंने एक रेगेक्स के साथ ऐसा करने की कोशिश की BASH_REMATCHलेकिन बैश v3 को परेंस पसंद नहीं आया और मैं समझ नहीं पाया कि उन्हें कैसे ठीक से बचाना है। आह।


0

मेरा मानना ​​है कि यह विकल्प बहुत आसान है, बस करके:

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

तो इसे अपने .bashrc फ़ाइल में PS1 चर पर असाइन करें:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.