PS1 में मेरे कार्य का पुनर्मूल्यांकन क्यों नहीं किया जाता है?


15

मैं अपने प्रॉम्प्ट सेट का एक हिस्सा गतिशील रूप से एक फ़ंक्शन द्वारा करने की कोशिश कर रहा हूं, इसलिए मेरे .bashrcपास मेरे पास है:

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "

एक खोलना मुझे वह देता है जिसकी मुझे पहले से उम्मीद थी:

$ bash
darthbith@server:~/test /home/darthbith/test$

हालाँकि, जब मैं निर्देशिका बदलता हूं, तो फ़ंक्शन द्वारा परिभाषित हिस्सा नहीं बदलता है:

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$

मेरा वास्तविक लक्ष्य मेरी गिट रिपॉजिटरी की शाखा को दिखाने के लिए git-prompt.shस्क्रिप्ट का उपयोग करना है जब मैं सुंदर रंगों और सब कुछ के साथ एक हूं, लेकिन समस्या यह है कि जब मैं रिपॉजिटरी बदलते हैं तो यह शाखा नाम को कभी अपडेट नहीं करता है। ऊपर दिया गया तुच्छ उदाहरण सबसे सरल प्रजनन है जिसे मैं अपने प्रश्न के लिए ले सकता हूं।

जिन .bashrcलाइनों को मुझे गिट-प्रॉम्प्ट स्क्रिप्ट को एकीकृत करना है:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "

एक साइड नोट पर, यदि आप एक git प्रॉम्प्ट चाहते हैं, तो मैं github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

जवाबों:


22

बैश प्रॉम्प्ट होटो के अनुसार :

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

कमांड प्रतिस्थापन के डॉलर के संकेत से पहले बैकस्लैश को नोटिस करना महत्वपूर्ण है। इसके बिना, बाहरी कमांड को ठीक एक बार निष्पादित किया जाता है: जब PS1 स्ट्रिंग को पर्यावरण में पढ़ा जाता है।


धन्यवाद! अब अगर केवल मैं इसे फंक्शन से वापस आने वाले सीक्वेंस के बदले रंगों को प्रिंट करने के लिए
पा सकूं

6

जब आपने $(..)डबल-कोट्स में उपयोग किया , तो शेल ने असाइन करने से पहले कमांड प्रतिस्थापन का मूल्यांकन किया PS1। इस प्रकार, PS1केवल आउटपुट होता है, न कि कमांड प्रतिस्थापन। इसके बजाय, या तो सिंगल-कोट्स का उपयोग करें, या इससे बच जाएं $, ताकि स्ट्रिंग को इस तरह से पास किया जाए PS1और जब प्रॉम्प्ट किया जाए तो इसका मूल्यांकन किया जाए:

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 

की तुलना करें:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.