कमांड द्वारा सूक्ति टर्मिनल प्रांप्ट स्ट्रिंग का टॉगल प्रारूप?


9

मेरे टर्मिनल में इस तरह एक डिफ़ॉल्ट शीघ्र प्रारूप है:

उपयोगकर्ता नाम @ बॉक्सनाम / पथ / से / वर्तमान / निर्देशिका $

इसे बनाने वाला कोड इस तरह दिखता है: (इसमें कुछ रंग परिभाषाएँ भी हैं)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

यदि वर्तमान निर्देशिका के लिए रास्ता बहुत लंबा हो जाता है तो टर्मिनल के साथ काम करना अप्रिय हो जाता है क्योंकि आप लगातार लाइनें तोड़ते हैं। ऐसे मामलों में मैं एक प्रारूप पसंद करूंगा जो इस तरह की एक छोटी स्ट्रिंग पैदा करता है:

उपयोगकर्ता नाम @ boxname current_dir_name $

इसे बनाने वाला कोड इस तरह दिखाई देगा (फिर से रंग के साथ):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

क्या किसी को पता है कि कैसे मैं आसानी से उदाहरण के लिए टाइप करके वर्तमान टर्मिनल विंडो के प्रारूप को एक शैली से दूसरी शैली में टॉगल कर सकता हूं prompttoggle:?


6
क्या आप bash के PROMPT_DIRTRIM पैरामीटर से अवगत हैं?
इस्पात

@steeldriver अब तक नहीं। के बीच टॉगल करना PROMPT_DIRTRIM=0और PROMPT_DIRTRIM=1अलग-अलग मूल्यों के बीच टॉगल करने की तुलना में सरल लगता है PS1और परिणाम लगभग समान है। जानकारी के लिए धन्यवाद!
रोटेरेटी

PROMPT_DIRTRIMएक का उपयोग करना भी कमांड में तर्क जोड़ सकता है। आप कोई तर्क पार कर लेते हैं आप के बीच टॉगल PROMPT_DIRTRIM=0और PROMPT_DIRTRIM=1और यदि आप एक तर्क के रूप एक नंबर पारित आप सेट PROMPT_DIRTRIMइसे करने के लिए। promptlenतब कमांड के लिए अधिक उपयुक्त नाम होगा।
रोटेरेटी

जवाबों:


10

PS1एक अलग नाम के तहत अपने दोनों लंबे और छोटे चर स्टोर करें:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

PS1शुरू में उनमें से एक पर सेट करना सुनिश्चित करें :

PS1="$PS1long"

तो फिर तुम दो PS1 मूल्यों के बीच इस तरह एक उपनाम बना सकते हैं:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

आपकी ~/.bashrcफ़ाइल में सभी चार पंक्तियों को जोड़ने से आपके बैश सत्रों में उपलब्ध कमांड को ake कर दिया जाएगा, यहाँ वे फिर से आसान नकल के लिए हैं:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

आप एक छोटे से bashसमारोह का उपयोग कर सकते हैं :

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

मैचों ऊपर समारोह वर्तमान अगर $PS1होता है basename, हाँ है, तो PS1बिना basenameअन्यथा के साथ एक सेट है basenameसेट है।

~/.bashrcसभी इंटरेक्टिव सत्रों में इसे उपलब्ध कराने के लिए फ़ंक्शन को अपने पास रखें ।

उदाहरण:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

या ... दो बहुत छोटे कार्य करें और अपने अंत में जोड़ें~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

छोटे प्रॉम्प्ट के लिए, टाइप करें promptshort, पूर्ण पथ पर वापस जाने के लिए, टाइप करेंpromptlong

\Wवर्तमान कार्य निर्देशिका को केवल इतना दिखाता है कि $(basename ${PWD})ओवरहिल इम्हो

आप एक फ़ंक्शन में जोड़ सकते हैं लेकिन "लंबे" और "लघु" वर्णनात्मक हैं और दोनों में "टॉगल" की तुलना में कम कीस्ट्रोक हैं;))

PS1 को ओवरराइड करने के लिए एक पंक्ति जोड़ने के बजाय मैं उस कोड को ट्विस्ट करना पसंद करता हूं जो इसे सेट करता है (उदाहरण के लिए, force_color_prompt=yesपंक्ति के बाद असहजता और संपादित करें [ "$color_prompt" = yes ]; then)


3

यहां एक ~/.bashrcफ़ंक्शन परिभाषा है जिसका उपयोग मैं व्यक्तिगत रूप से अपने प्रॉम्प्ट को केवल नियमित प्रॉम्प्ट से रीसेट / टॉगल करने के लिए करता हूं $। अपनी आवश्यकताओं के अनुरूप इसे आवश्यक रूप से अपनाएं।

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

यह आपकी समस्या का उत्तर है (लंबी निर्देशिका कमांड लाइन को तोड़ती है) और विशेष रूप से आपके प्रश्न के लिए नहीं (फ्लाई पर कमांड प्रॉम्प्ट को कैसे बदलें)।

मैंने इस समस्या को इस संकेत के साथ वर्षों पहले हल किया था:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

यह क्या करता है:

  1. पिछले कमांड का एक्ज़िट वैल्यू आउटपुट (यह अविश्वसनीय रूप से उपयोगी है)
  2. वर्तमान उपयोगकर्ता को आउटपुट करें और एक रंग में होस्ट करें
  3. एक और रंग में कार्य निर्देशिका का उत्पादन (अपने स्वाद के लिए रंगों को समायोजित करें)
  4. डॉलर और स्पेस को एक नई लाइन पर आउटपुट करता है , लाइन ब्रेक से पहले रंग अनुक्रम को समाप्त करता है

यह आपको आपके आदेश के लिए आवश्यक सभी स्थान देता है, जब आप एक गहरी निर्देशिका संरचना में होते हैं, तो इसे सही तरीके से स्थानांतरित नहीं करते हैं, रंग कोड के साथ टाइपिंग लाइन को कम नहीं करता है (कभी-कभी अजीब कीड़े से बचने के लिए), जबकि अभी भी आपको रंग दे रहा है संकेत, जहां एक कमांड का आउटपुट समाप्त हो गया और अगले का आरंभ हुआ:

यहां छवि विवरण दर्ज करें

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