टर्मिनल प्रॉम्प्ट सही ढंग से नहीं लपेट रहा है


170

मेरे पास एक मुद्दा है जहां अगर मैं bash में बहुत लंबे कमांड टाइप करता हूं तो टर्मिनल रेंडर नहीं करेगा जो मैं सही तरीके से लिख रहा हूं। मुझे उम्मीद है कि अगर मेरे पास निम्नलिखित की तरह एक कमांड थी:

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com

कमांड को दो लाइनों पर प्रस्तुत करना चाहिए। इसके बजाय यह अक्सर चारों ओर लपेटता है और मेरे प्रॉम्प्ट के शीर्ष पर लिखना शुरू करता है, कुछ इस तरह से:

myreallylongusername@something.somelongserver.comh -i /path/to/private/key

अगर मैं वापस जाने का फैसला करता हूं और कुछ तर्क को बदल देता हूं तो कोई बता नहीं रहा है कि कर्सर कहां दिखाई देगा, कभी-कभी प्रॉम्प्ट के बीच में, लेकिन आमतौर पर मैं जहां टाइप कर रहा हूं वहां ऊपर की लाइन पर ।

अतिरिक्त मज़ा तब होता है जब मैं Upपिछली कमांड पर आता हूं । मैंने ग्नोम-टर्मिनल और टर्मिनेटर और i3 और दालचीनी दोनों में यह कोशिश की है। किसी ने सुझाव दिया कि यह मेरा संकेत है, इसलिए यहाँ है:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrll, resetऔर clearसभी वही करते हैं जो वे कहते हैं, लेकिन जब मैं वापस कमांड टाइप करता हूं या Upवही चीजें होती हैं।

मैंने जाँच की और checkwinsizeबैश में सक्षम है। यह 80x24 और अन्य विंडो आकारों पर होता है।

क्या यह सिर्फ कुछ है जो मैं जीना सीखता हूं? क्या कोई जादू का टुकड़ा है जो मुझे पता होना चाहिए? मैं बस एक बहुत कम संकेत का उपयोग करने के लिए तय किया है, लेकिन यह समस्या को ठीक नहीं करता है।


1
इसलिए कमांड का उपयोग करके env -i bash --norcइसे ठीक करता है। $ COLUMNS और $ LINES मैच। इसका मतलब यह है कि मेरे .bashrc के साथ कुछ अजीब है?
मारीकुला

इसलिए मैंने अपने .bashrc पर टिप्पणी की और अपने प्रॉम्प्ट को समस्याग्रस्त हिस्से के रूप में अलग कर दिया, जिसमें विशेष रूप से रंग वाक्य रचना शामिल थी। PS1 के ऊपर क्या गलत है?
मारीकुला

1
\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]व्यवहार में अजीब से बचने के लिए लगता है - लेकिन यह नहीं जानते कि क्या यह आपके मूल संकेत का पूरी तरह से सम्मान करता है ...

जवाबों:


188

प्रिंट न हो सकने दृश्यों किया जाना चाहिए में संलग्न \[और\] । अपने PS1 को देखते हुए इसके बाद एक स्पष्ट अनुक्रम है \W। लेकिन, दूसरी प्रविष्टि निरर्थक है और साथ ही यह पिछले कथन "1; 34" को दोहराती है ।

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

इस तरह के रूप में इस रंग का इरादा होना चाहिए:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.

"मूल" रखते हुए यह भी काम करना चाहिए:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

संपादित करें:

व्यवहार का कारण है क्योंकि bashविश्वास है कि संकेत अब लंबा है तो यह वास्तव में है। एक सरल उदाहरण के रूप में, यदि कोई उपयोग करता है:

PS1="\033[0;34m$"
       1 2345678

प्रांप्ट को 8 अक्षर माना जाता है, न कि 1. जैसे कि यदि टर्मिनल विंडो 20 कॉलम है, तो 12 अक्षर टाइप करने के बाद, यह माना जाता है कि यह 20 है और चारों ओर लपेटता है। यह भी स्पष्ट है कि यदि कोई बैकस्पेस या करने की कोशिश करता है Ctrl+u। यह स्तंभ 9 पर रुकता है।

हालाँकि, यह तब तक नई लाइन शुरू नहीं करता है जब तक कि कोई अंतिम कॉलम पर न हो, परिणामस्वरूप पहली पंक्ति ओवरराइट हो जाती है।

यदि कोई टाइप करता रहता है तो लाइन को 32 अक्षरों के बाद अगली पंक्ति में लपेट देना चाहिए।


यदि आपके पास - या किसी के पास - एक स्पष्टीकरण है कि मूल अनुक्रम में वास्तव में क्या कारण है कि लाइन खुद को दोहराती है, तो मुझे यह जानने में दिलचस्पी होगी। यह भी कि आपने इसे नेत्रहीन कैसे दिखाया है, इसके लिए +1।

1
@ illumin but: स्रोत को नहीं देखा है, लेकिन अवलोकन से व्यवहार पर एक नोट के साथ एक अद्यतन जोड़ा है।
रनियम

यदि आप किसी समस्या का सामना कर रहे हैं, तो आप इस वेबसाइट का उपयोग एक नया बनाने के लिए कर सकते हैं - bashrcgenerator.com
divinedragon

यह आश्चर्यजनक है, धन्यवाद @Runium - क्या आप इसे साझा करना चाहेंगे कि आपको यह कैसे पता चला? मुझे इस पर कुछ प्रलेखन खोजने में अच्छा लगेगा।
nycynik

2
@nycynik: अवलोकन। मुझे लगता है कि इस पर प्रलेखन का सबसे करीबी स्रोत कोड है ...
रनियम

83

यह ज्यादातर टर्मिनल द्वारा ग्रहण की गई खिड़की के आकार के साथ करने के लिए है, यह आपके वास्तविक खिड़की के आकार के समान नहीं है। यदि आप बैश का उपयोग कर रहे हैं, तो आप यह कोशिश कर सकते हैं।

$ shopt checkwinsize

यदि आपको नहीं मिलता है

checkwinsize    on

फिर इसके साथ सक्रिय करें

$ shopt -s checkwinsize

फिर बस एक और कमांड चलाने का प्रयास करें (जैसे ls) या एक बार विंडो का आकार बदलना, उपरोक्त हर बार मेरे लिए काम करता है।

Redhat सिस्टम के लिए विशेष रूप से, समस्या अक्सर गलत ~/.bashrcकॉल न करने के कारण होती है /etc/bashrc। आम तौर पर, बैश लोड ~/.bashrcजो कॉल करने के लिए अपेक्षित है /etc/bashrc, जो डिफ़ॉल्ट रूप से होता है shopt -s checkwinsize


OS X के साथ भी यही समस्या थी, यदि आप अपने टर्मिनल को शुरू करने के लिए "लॉगिन" कहते हैं, तो यह इस तरह से शुरू होता है, जो पढ़ता है / / bashrc, लेकिन अगर आप सीधे सीधे bash को कॉल करते हैं, तो ~ / .bashrc नहीं करता है। स्रोत चीजें डिफ़ॉल्ट रूप से ताकि आपको विषम रैपिंग प्रभाव प्राप्त हो। धन्यवाद!
रोज़गारपैक

यह मेरे लिए भी काम किया। रंग इस विशेष सर्वर में नहीं थे, सही कह रहे थे /etc/bashrc, बाकी सब कुछ जाना अच्छा था ... पता चलता है कि यह रैपिंग मुद्दों का कारण है।
धापिन २०'१५

यह भी देखें unix.stackexchange.com/a/61608/2221
astrojuanlu

एक अच्छा समाधान की तरह लग रहा है। लेकिन यह मेरे ssh सत्र में काम नहीं करता है, हालांकि। यकीन नहीं है कि क्यों। मैंने shopt -s checkwinsizessh सत्र में कमांड को चलाया है । लेकिन लपेटना जारी रहता है।
किआंग जू

यह वास्तव में मेरी समस्या थी - एक उपयोगकर्ता .bashrc फोन नहीं कर रहा था / etc / bashrc, और इसलिए गड़बड़ कर रहा था।
सोब्रीक

9

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, गैर-मुद्रण योग्य अनुक्रम जैसे कि के \e[0;30mसाथ लिपटे होना चाहिए \[...\]

इसके अतिरिक्त (जो मैंने अभी तक उल्लेख नहीं किया है) ऐसा लगता है कि यदि आपके पास बहु-पंक्ति संकेत है , तो \r\nयह बाहर होना चाहिए \[...\]। इसने मुझे कुछ परीक्षण और त्रुटि का पता लगाने के लिए आखिरकार समझ लिया।


8

मैं एक बार कहीं पढ़ा (पता नहीं जहां अब और) का उपयोग कर \001और \002बजाय \[और \]इस समस्या को हल कर सकते हैं। इसने मेरे लिए किया।

वैसे, PS1 को परिभाषित करने के लिए बदसूरत नहीं दिखना है।

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset

2
मेरा PS1 एक कमांड को कॉल करता है, जो ओपी की समस्या के कारण अनुक्रम से बच निकलता है। केवल यह समाधान मेरे लिए समस्या को हल करता है।
रिकमेशम

6

यह आपके COLUMNSऔर LINESपर्यावरण चर सेटिंग्स के साथ एक समस्या की तरह लगता है । जब आप उस विंडो का आकार बदल लेते हैं जिसे वे आमतौर पर सूक्ति-टर्मिनल द्वारा स्वचालित रूप से सेट करते हैं (मेरा मानना ​​है) आप उन्हें आदेश जारी करके मैन्युअल रूप से सेट करने के लिए मजबूर कर सकते हैं resize

उदाहरण

अगर मैं 79x17 तक अपने गनोम-टर्मिनल का आकार बदलता हूं, तो मेरे चर ऐसे दिखते हैं:

$ echo $COLUMNS; echo $LINES
79
17

मैं इसे इस तरह से मजबूर कर सकता हूं:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;

1
दिलचस्प है, लेकिन मदद नहीं करता है।
मारीकुला

1
यह मेरी समस्या है कि मैं "स्क्रीन" कमांड चलाने के बाद लाइनों को सही ढंग से लपेट नहीं रहा था। धन्यवाद!!
nukeguy

5

रैपिंग को रोकने के लिए, आप स्तंभों की संख्या बढ़ा सकते हैं, उदाहरण के लिए

stty columns 120

1
बहुत अच्छा विचार नहीं है, इसने बड़ी बेरहमी से
खिलवाड़ किया

3

साथ ही विस्तृत यूनिकोड प्रतीकों (जैसे https://stackoverflow.com/a/34812608/1657819 ) का उपयोग करके भी यही समस्या हो सकती है । यहाँ स्निपेट समस्या पैदा कर रहा है (मन ठीक है $Greenऔर $Redरंग के तार से बच गए हैं):

FancyX='\342\234\227'
Checkmark='\342\234\223'


# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi

बैश सही ढंग से लंबाई की गणना नहीं कर सकता है, इसलिए सबसे आसान तरीका उन चौड़े प्रतीकों के तीन भागों में से 2 से बच सकता है।

FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'

समझ में आता है। मुझे लगता है कि बैश पात्रों की गिनती करता है। क्योंकि X एक चर लेता है, लेकिन 3 के रूप में लिखा जाता है, तो एक को गिनती को ठीक करने के लिए उनमें से 2 को संलग्न करना होगा। @blauhirn उत्तर यह भी बताता है कि कैसे एक समारोह में \001और कैसे करना है \002
अकोस्टैडिनोव

FYI करें, यह है कि आप इस प्रारूप में मल्टी-बाइट यूनिकोड वर्णों का उत्पादन कैसे करते हैं: stackoverflow.com/a/602924/520567
akostadinov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.