बैश प्रॉम्प्ट में केवल वर्तमान और मूल निर्देशिका दिखाएं


16

मैं बैश करने के लिए नया हूं और अपने संकेत को कुछ ऐसा दिखाने के लिए चाहूंगा जो tcsh में तुच्छ था, फिर भी एक अच्छी Google खोज के बाद मैं ऐसा नहीं कर सकता।

मैं अपने संकेत को इस तरह से केवल वर्तमान और मूल निर्देशिका में शामिल करना चाहूंगा:

/parent/currentdir $

Tcsh में यह प्राप्त होता है:

set prompt = "%C2 %"

हालाँकि अभी तक मैं केवल एक ही आउटपुट प्राप्त करने के लिए pwd पार्स करना है।

वहाँ एक आसान तरीका नहीं है, जैसे करना:

export PS1="$(some_command) $" 

2
सिद्धांत रूप में, PS1='\w \$'; PROMPT_DIRTRIM=2आपको बैश के बराबर देना चाहिए, लेकिन यह मेरे सिस्टम पर ठीक से काम नहीं करता है।
मिकेल

यह मेरा बिल्कुल काम नहीं करता है: GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin14)।
Twalbaum

PROMPT_DIRTRIMबैश 4 में पेश किया गया था । मैंने सिर्फ WSL के तहत Ubuntu 16.04 पर परीक्षण किया और इसने बहुत अच्छा काम किया!
माइक ब्रांस्की 18

जवाबों:


18

बैश के त्वरित नियंत्रण सुविधाएँ स्थिर हैं। यदि आप अधिक नियंत्रण चाहते हैं, तो आप अपने प्रॉम्प्ट में चर शामिल कर सकते हैं; सुनिश्चित करें कि आपने promptvarsविकल्प बंद नहीं किया है

PS1='${PWD#"${PWD%/*/*}/"} \$ '

एकल उद्धरणों पर ध्यान दें: चर का विस्तार उस समय होना चाहिए, जब प्रॉम्प्ट प्रदर्शित किया गया हो, उस समय नहीं जब PS1चर परिभाषित किया जाता है।

यदि आप प्रदर्शित हैं पर अधिक नियंत्रण चाहते हैं, तो आप कमांड प्रतिस्थापन का उपयोग कर सकते हैं। उदाहरण के लिए, ऊपर दिया गया स्निपेट ~होम डायरेक्टरी के लिए संक्षिप्त नाम खो देता है ।

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

यह कोड बल्कि बोझिल है, इसलिए इसे PS1चर में चिपकाने के बजाय , आप PROMPT_COMMANDचर को चलाने के लिए कोड को सेट करने के लिए उपयोग कर सकते हैं HPWDऔर फिर अपने प्रॉम्प्ट में इसका उपयोग कर सकते हैं।

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

चूंकि छोटा प्रॉम्प्ट केवल एक निर्देशिका परिवर्तन पर बदल गया है, आपको हर बार एक प्रॉम्प्ट प्रदर्शित होने पर इसे पुनर्गणना करने की आवश्यकता नहीं है। बैश एक हुक प्रदान नहीं करता है जो एक वर्तमान निर्देशिका परिवर्तन पर चलता है, लेकिन आप इसे ओवरराइडिंग cdऔर इसके चचेरे भाई द्वारा अनुकरण कर सकते हैं ।

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

ध्यान दें कि आपको इसकी आवश्यकता नहीं है, और निर्यात नहीं करना चाहिए PS1, क्योंकि यह शेल सेटिंग है, पर्यावरण चर नहीं है। एक बैश PS1सेटिंग अन्य गोले द्वारा समझ में नहीं आएगा।

पुनश्च यदि आप एक अच्छा इंटरैक्टिव शेल अनुभव चाहते हैं, तो zsh पर स्विच करें , जहां ये सभी (शीघ्र %विस्तार बड़े पैमाने पर tcsh chpwd, इत्यादि शामिल हैं ) मूल विशेषताएं हैं।

PS1='%2~ %# '

2
यह स्वीकार किया जाना चाहिए और सबसे उत्कीर्ण जवाब।
लार्स

3

माता-पिता और वर्तमान निर्देशिकाओं को प्राप्त करने का सिंटैक्स मुनई के उत्तर से लिया गया है ।

हालाँकि, जैसा कि गिल्स ने कहा है, उस कोड को केवल उस समय की वर्तमान निर्देशिका से पता चलता है कि .bashrcलोड किया गया है, लेकिन जब आप सिस्टम को अन्य फ़ोल्डरों में नेविगेट करेंगे तो यह नहीं बदलेगा।

आपकी .bashrcफ़ाइल में यह होने से आपकी वर्तमान निर्देशिका में तुरंत अपडेट हो जाती है:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
क्या परिभाषित prompt_command()करना कुछ करना है, अपने दम पर? यह मेरे लिए नहीं है। क्या आपका मतलब यह भी है prompt_command()कि cd& rsquo की पुनर्परिभाषितों का उपयोग करें , जैसे गिल्स ने किया था? या तुम्हारा मतलब था PROMPT_COMMAND='...'?
लार्स

2
इसके अलावा, यह आदेश विफल रहता है जब $PWDएक स्थान होता है।
लार्स

1
मुझे इसे वापस लाने के लिए धन्यवाद। रिक्त स्थान के लिए अनुमति देने के लिए $ PWDs का हवाला दिया और अंतिम आदेश को शामिल किया। मेरा वर्तमान संकेत इससे अधिक जटिल है, इसलिए प्रॉम्प्ट_कमांड परिभाषा की आवश्यकता है। अन्यथा, PS1 = ... अपने पर काम करता है।
ट्वलबबम

जब नेविगेट करने के लिए आउटपुट को साफ करने के लिए कोई विचार /? जैसा कि लिखा है, आपको मिलता है/// $
ezrock

0

bashशेल चर को संपादित करके शीघ्र स्ट्रिंग को आसानी से बदला जा सकता है PS1। यह स्ट्रीप स्ट्रिंग के लिए खड़ा हैयहाँ अधिक जानकारी ।

अभी के लिए अपने bashखोल को आग लगाओ ।

vi ~/.bashrc

फ़ाइल में PS1 परिभाषा को जोड़ें

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

अधिक ट्यूटोरियल यहाँ और यहाँ , मदद करने के लिए आप इसे और भी अधिक tweak।


1
मैं समझता हूं कि प्रॉम्प्ट को कैसे संशोधित किया जाए। मेरा सवाल है कि केवल वर्तमान और मूल निर्देशिका कैसे प्राप्त करें, संपूर्ण पथ नहीं।
ट्वैलबाम

@twalbaum ने मेरे जवाब को संपादित किया
मुनई दास उदासीन


1
यह वर्तमान निर्देशिका के .bashrcलिए संकेत लोड होने के समय पर सेट होता है, यदि आप cdकिसी अन्य निर्देशिका में जाते हैं , तो संकेत परिवर्तित नहीं होगा ! @twalbaum
गाइल्स '

@ यह मेरे लिए करता है।
ट्वेलबाम

0

होम निर्देशिका के लिए "~" के साथ सरल हो सकता है।

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.