इतिहास को स्क्रॉल करते समय यह बैश कभी-कभी पिछली आज्ञाओं का हिस्सा क्यों होता है?


29

मेरा बैश प्रॉम्प्ट, जिसे मैं कुछ स्थानों से चुराकर एक साथ सिलने के लिए स्वीकार करूँगा, कभी-कभी पिछले इतिहास के भाग को अपनी लंबाई में जोड़ देगा जब बैश इतिहास को ऊपर / नीचे तीर के साथ स्क्रॉल किया जाएगा।

उदाहरण के लिए, यदि मेरे पिछले आदेश थे:

ls
cd /home/caleb
vim .bashrc

जब मैं अपने संकेत पर था और दो बार स्क्रॉल किया तो ऐसा लग सकता है:

$ vb .bcd / home / caleb

जहां पहले पांच अक्षर अंतिम कमान से बचे हैं।

क्या किसी को यह पता नहीं है कि ऐसा क्यों हो रहा है, और इसे कैसे रोका जा सकता है?

मेरा संकेत इस कोड के साथ सेट किया गया है (यहाँ शामिल करने के लिए लंबे समय तक): https://gist.github.com/1679352


1
पूरे vcs बकवास के बिना PS1 को एक मूल्य पर सेट करें और देखें कि क्या होता है। ऐसा मेरा अनुमान है।
डैनियल बेक

क्या आपने पहले ही अपराधी को अपने संकेत में पाया है? मैं एक ही मुद्दा रहा हूँ।
एक्मे

हाँ बैश इसे रंगों पर खो देता है, और दिखाई देने वाले तार की लंबाई से रंग के साथ तार की लंबाई को अलग करने में असमर्थ है। यह वही है जो SiegeX को मिल रहा था। मैंने ZSH पर स्विच करना और एक अलग संकेत का उपयोग करना समाप्त कर दिया। ZSH में एक ही मुद्दा नहीं है।
कालेब थॉम्पसन

1
पिछले दोनों जवाबों से मेरी समस्या हल नहीं हुई, और कोई स्पष्टीकरण नहीं दिया कि ऐसा क्यों हुआ। कृपया जांचें कि कस्टम बैश प्रॉम्प्ट स्वयं ओवरराइटिंग कर रहा है , अगर किसी को इस बिंदु पर खोज करनी है।
डी 3 हंटर

संबंधित मुद्दा unix.stackexchange.com/questions/105958/…
matthiasbe

जवाबों:


6

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


37

रंग कोडों को वर्गाकार कोष्ठकों में लपेटने की आवश्यकता होती है। कोष्ठक बाश को सूचित करते हैं कि संलग्न पाठ को मुद्रित नहीं किया जाना चाहिए

@ फ्रेडिटर के उदाहरण पर निर्माण, यह दर्शाता है कि नई रूपरेखा के बाद किए गए किसी भी स्वरूपण के परिणामस्वरूप मूल मुद्दा होगा:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

[] में प्रारूप कोड लपेटने से यह सुनिश्चित होता है कि कष्टप्रद व्यवहार कभी नहीं होता है:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

प्रलेखन: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.s.html

चूंकि पीएस 1 प्रारूपण का मूल्य इतना लंबा और पढ़ने में कठिन होता है क्योंकि मैं प्रारूप कोड चर में डाल देता हूं:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
यह स्वीकृत उत्तर होना चाहिए। मसला हल किया।
एटकोल्ड

1
यह ध्यान दिया जाना चाहिए (क्योंकि मैं इसे नोट करने में विफल रहा;)), कि बैकस्लैश और स्क्वायर ब्रैकेट की उस गड़बड़ी में, चौकोर कोष्ठक जो भागने के क्रम का पालन करते हैं, \033उन्हें बचाना नहीं चाहिए। केवल रैपिंग स्क्वायर ब्रैकेट्स से बच जाना है।
बेंजम

मेरे लिए उन सभी विशेष पात्रों से निपटने के लिए भ्रमित करने का तरीका, पहले Google परिणाम का उपयोग करके काम करने का संकेत उत्पन्न करने में मदद मिली कि मैं इसे कैसे चाहता था: ezprompt.net
Mallox

मैं YEARS के लिए अपने शीघ्र रंगों को अनुकूलित करना चाहता हूं, लेकिन कभी भी मेरे पास यह मुद्दा नहीं था! मैं कभी यह पता नहीं लगा सका कि मैंने बस क्यों रोका और सब कुछ सफेद रखा ... मैं बस एक नया कंप्यूटर सेट कर रहा था और यह आखिरकार मेरे लिए शुरू हो गया कि वास्तव में एक बार Google को समस्या हो ... तो मुझे खुशी हुई! इस अद्भुत पाठ के लिए धन्यवाद।
TylerH4

8

मुझे भी यही समस्या थी और यह रंग परिभाषाओं से संबंधित था।

मेरे मामले में, मेरे पास एक मल्टी-लाइन प्रॉम्प्ट है (वर्तमान कमांड के लिए सबसे अधिक स्थान देता है, चाहे प्रॉम्प्ट द्वारा प्रदर्शित पथ की लंबाई की परवाह किए बिना)।

खराब संस्करण:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

अच्छा संस्करण:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mरंग को समाप्त करता है। यदि यह नई लाइन के बाद है ( \n), तो यह टर्मिनल में उचित redraw को रोकता है, बैकग्राउंड कलर के साथ पिछले कमांड्स को ओवरराइट करने के लिए। इसे नई लाइन के पीछे ले जाकर समस्या का समाधान किया।

(मैक ओएस 10.8 में टर्मिनल का उपयोग कर)


इसने मेरे लिए इस मुद्दे को इंगित किया, जबकि वर्तमान स्वीकृत उत्तर बहुत सामान्य था।
ब्रायन

यह अधिक सटीक उत्तर है और विजेता होना चाहिए (और मेरी समस्या का समाधान भी था)।
क्रेवेट्रेन

\nभी मेरे लिए दोषी थे। धन्यवाद!
मुहल्ले १२'१६ को

3

मुझे वास्तव में लगता है कि यह एक लापता 'नॉन-प्रिंटिंग कैरेक्टर' सीमांकक के साथ करना है। मैं वास्तव में एक ही मुद्दा था, लेकिन इसे newline (\ n) से पहले ले जाने से इसे ठीक नहीं किया गया। इसके बजाय मैंने सभी गैर-मुद्रण वर्णों (यहाँ, रंग कमांड) को '\ _' और '\]' से घेर लिया।

खराब (काम करता है, लेकिन ऊपर वर्णित इतिहास-समस्या निवारण):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

गुड ('\ _' और '\]' के साथ सभी कलर कमांड को घेरता है - मैस्ड कमांड हिस्ट्री नहीं दिखाता है):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

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

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(यह निश्चित रूप से SecureCRT का सच है और दूसरों का सच हो सकता है, जैसे कि PuTTY या TeraTerm - अपने हिस्से के लिए आवश्यक परीक्षण।)

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