अगली पंक्ति में लपेटने के लिए मुझे लंबी कमांड लाइनें कैसे मिलेंगी?


108

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

इसे देखे बिना समझाना कठिन है, लेकिन मान लीजिए कि मेरा टर्मिनल 20 वर्णों का चौड़ा था (खदान 120 वर्णों की तरह है - लेकिन उदाहरण के लिए) और मैं अंग्रेजी वर्णमाला को प्रतिध्वनित करना चाहता हूं। मैं क्या टाइप कर रहा हूँ:

echo abcdefghijklmnopqrstuvwxyz

लेकिन कुंजी मारने से पहले मेरा टर्मिनल कैसा दिखता है:

pqrstuvwxyzghijklmno

जब मैं एंट्री मारता हूं तो यह इको हो जाता है

abcdefghijklmnopqrstuvwxyz

इसलिए मुझे पता है कि आज्ञा ठीक से मिली थी। यह सिर्फ "ओ" के बाद मेरी टाइपिंग को लपेटता है और उसी लाइन पर शुरू होता है।

मैं क्या होने की उम्मीद करूंगा, अगर मैंने इस आदेश को एक टर्मिनल पर टाइप किया जो केवल 20 वर्णों का था, तो यह होगा:

echo abcdefghijklmno
pqrstuvwxyz

पृष्ठभूमि: मैं अपने शेल के रूप में बैश का उपयोग कर रहा हूं, और मेरे पास मेरी ~ / .bashrc में यह पंक्ति है।

set -o vi

VI आदेशों के साथ कमांड लाइन नेविगेट करने में सक्षम होने के लिए। मैं वर्तमान में Ubuntu 10.10 सर्वर का उपयोग कर रहा हूं, और पोटीन के साथ सर्वर से जुड़ रहा हूं।

मेरे द्वारा काम किए गए किसी भी अन्य वातावरण में, यदि मैं एक लंबी कमांड लाइन टाइप करता हूं, तो यह उस लाइन के नीचे एक नई लाइन जोड़ देगा जो मैं तब काम कर रहा हूं जब मेरी कमांड टर्मिनल चौड़ाई से अधिक लंबी हो जाती है और जब मैं टाइप करता रहता हूं तो मैं अपनी कमांड देख सकता हूं 2 अलग लाइन। लेकिन जब तक मैं उबंटू का उपयोग करके याद रख सकता हूं, मेरे लंबे कमांड केवल 1 लाइन पर कब्जा कर लेते हैं।

यह तब भी होता है जब मैं इतिहास में पिछली कमांड पर वापस जा रहा हूं (मैंने Esc को मारा, फिर 'K' को पिछली कमांड पर वापस जाने के लिए) - जब मुझे पिछली कमांड मिलती है जो टर्मिनल चौड़ाई से अधिक लंबी थी, तो कमांड लाइन मिलती है। मैं उलझ गया और मैं यह नहीं बता सकता कि मैं कमान में कहाँ हूँ।

पूरे लॉन्ग कमांड को देखने के लिए एकमात्र कार्य-आस-पास मुझे "Esc-V" हिट करना है, जो एक VI संपादक में वर्तमान कमांड को खोलता है।

मुझे नहीं लगता कि मेरे पास .bashrc फ़ाइल में कुछ भी अजीब है। मैंने "सेट -o vi" लाइन पर टिप्पणी की, और मुझे अभी भी समस्या थी।

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

क्या किसी और को यह समस्या थी, और क्या कोई सोच सकता है कि इसे कैसे ठीक किया जाए?

संपादित करें

यह मेरी .bashrc फ़ाइल थी। मैंने मशीन से मशीन में एक ही प्रोफ़ाइल की प्रतिलिपि बनाई है, और मैंने अपने $ PS1 में विशेष वर्णों का उपयोग किया है जो किसी तरह इसे बंद कर रहे हैं। मैं अब अपने $ PS1 के लिए मानक बैश चर के साथ चिपका रहा हूँ।

.Bashrc पर टिप के लिए @ forndrük का धन्यवाद!

... अंत संपादित करें ...


1
बस यह सुनिश्चित करने के लिए कि समस्या आपके .bashrc फ़ाइल के कारण नहीं है, मैं अस्थायी रूप से इसकी एक प्रति के साथ प्रतिस्थापित करने की सलाह दूंगा /etc/skel/.bashrc। ध्यान रखें कि परिवर्तनों को प्रभावी करने के लिए आपको फिर से कनेक्ट करना होगा, और अपने स्वयं के .bashrc का बैकअप रखना सुनिश्चित करें।
20

1
आप किस टर्मिनल एप्लिकेशन का उपयोग कर रहे हैं? आपके द्वारा वर्णित व्यवहार सामान्य नहीं है, निश्चित रूप से डिफ़ॉल्ट नहीं है।
जोहो पिंटो

मेरे द्वारा (और सिस्को सीएलआई में) काम किए गए गोले में, आप अपनी लिखी गई लाइन को फिर से खोलने के लिए भी Ctrl-L टाइप कर सकते हैं, भले ही वह ऑफस्क्रीन हो। आपकी स्थिति में, वह अभी भी टूटे हुए उत्पादन का उत्पादन कर सकता है जिसके बारे में आप बात कर रहे हैं, लेकिन मैं उत्सुक हूं।
बेलाक्वा

3
समाधान के बारे में समझाते हुए एक "उत्तर" बनाने के लिए स्वतंत्र महसूस करें और इसे स्वीकृत के रूप में चिह्नित करें। यह थोड़ा मूर्खतापूर्ण लग सकता है, लेकिन उचित उत्तर देने से साइट को व्यवस्थित रखने में मदद मिलती है और भविष्य में इसी तरह की समस्याओं वाले अन्य लोगों को अधिक प्रभावी ढंग से मार्गदर्शन कर सकता है।
ændrük

जवाबों:


136

सुनिश्चित करें कि आपके PS1 में सभी गैर-मुद्रण योग्य बाइट्स भीतर निहित हैं \[ \]। अन्यथा, बैश उन्हें शीघ्र की लंबाई में गिना जाएगा। यह लाइन को लपेटने के लिए निर्धारित करने के लिए प्रॉम्प्ट की लंबाई का उपयोग करता है।

उदाहरण के लिए, यहां बैश को 19 कॉलम चौड़े के रूप में संकेत गिना जाता है, जबकि टर्मिनल द्वारा प्रदर्शित संकेत केवल 10 कॉलम चौड़ा है ( My promptसियान में लिखा गया है, और >डिफ़ॉल्ट रंग में लिखा गया है):

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

यहाँ जबकि यह केवल 10 कॉलम चौड़े के रूप में संकेत को गिनता है क्योंकि यह विशेष \[और \]बच के बीच बाइट्स को अनदेखा करता है:

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

हालांकि अच्छे अभ्यास के tputलिए, टर्मिनल बनाने के लिए हार्ड कोडिंग के बजाय बच निकलने का उपयोग करें:

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

Http://mywiki.wooledge.org/BashFAQ/053 देखें , और अधिक के लिए http://wiki.bash-hackers.org/scripting/terminalcodes भी देखें tput


3
यह समस्या का एक बड़ा विवरण है जो स्वीकृत उत्तर प्रदान नहीं करता है
जेमी कुक

कोड की अंतिम पंक्ति में PS1='...': एकल उद्धरण रोकथाम से $cyanऔर $resetप्रतिस्थापन से क्यों नहीं ?
और्रीबक

2
@andrybak, वे रोकते हैं $cyanऔर $resetप्रतिस्थापित किए जाने से, लेकिन PS1हर बार संकेत छपने पर मूल्यांकन किया जाता है। आप इसे कोशिश करके देख सकते हैं PS1='$var> 'और फिर varविभिन्न मूल्य दे सकते हैं और देख सकते हैं कि कैसे परिवर्तन होता है फिर प्रयास करें PS1="$var> " और ध्यान दें कि संकेत स्थिर रहता है; $varअसाइनमेंट के दौरान विस्तारित हुआ, हर बार PS1मूल्यांकन नहीं किया गया।
जिरह

1
ये अद्भुत है। इस पोस्ट के लिए बहुत बहुत धन्यवाद! यह वर्ग कोष्ठक से बचना बहुत आसान और अधिक पठनीय बनाता है।
फिएट

मैं यह काम कैसे करता हूं PS1=${PS1}"\e]2;$@\a"। मैंने कोशिश कीPS1=${PS1}"\[\e]2;\]$@\[\a\]"
रेड्डी

59

मुझे लगता है कि आपने अपने PS1रंगों को सही से कॉन्फ़िगर किया है ?

बस यह सुनिश्चित करें कि आप अपने रंग सेट से पहले अपनी बोली के \[अंदर हैPS1

उदाहरण के लिए:

PS1='\[\e[0;32m\u@\w/:\[\e[m '

मेरा PS1 था export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '- मैं लंबे समय से उस एक का उपयोग कर रहा हूं - यह केएसएच संगत है ...
ब्रायन

2
वाह। मैं हमेशा से टर्मिनल प्रॉम्प्ट का उपयोग कर रहा हूं और पहले कभी भी यह समस्या नहीं थी। कभी नहीं पता लगा होगा कि बाहर। धन्यवाद।
21

3
सरल उद्धरणों का उपयोग करते समय \ n का उपयोग करने से अनपेक्षित स्लैश प्राप्त होता है। इसके अलावा, वहाँ इस्तेमाल किया जाना चाहिए] जादुई वर्णों के अंत में, जैसा कि सबसे अच्छा मतदान जवाब में उल्लेख किया गया है
igorsantos07

2
-1 काम नहीं करता है। आपको शुरुआत और अंत में गैर-मुद्रण अनुभाग को लपेटने की आवश्यकता है । \[\]
वेजेंड्रिया

@ igorsantos07 डबल-बैकस्लैश में \\[एक संपादन के कारण टाइपो था। मैंने इसे ठीक कर लिया है।
वेजेंड्रिया

11

मेरे पास एक समान मुद्दा था, और अंत में एक सरल समाधान मिला।

अपनी .bashrcफ़ाइल में निम्न पंक्ति जोड़ें :

COLUMNS=250

फिर source ~/.bashrcवांछित प्रभाव प्राप्त करने के लिए टाइप करें।


कुछ मामलों में, जैसे कि संकीर्ण टर्मिनेटर उपखंड, समस्या प्रोम्ट रंग वर्णों में नहीं है, लेकिन सिर्फ एक गलत रंग मान में है। इस जवाब ने मुझे बहुत परेशान कर दिया!
कार्ला सला

1
लॉग ऑफ करना अनावश्यक है। करते हैं source .bashrc। आपका संकेत तुरंत अपडेट होगा
सर्जियो कोलोडियाज़नी

1
मैंने पाया कि चूंकि मैंने setwinsizeअपनी बैश के लिए सेट नहीं किया था , इसलिए यह COLUMNS को अपडेट नहीं कर रहा था, unix.stackexchange.com/a/167911/8337
rogerdpack

1
मैंने उसके export COLUMNS=250बाद किया export TERM=xtermऔर यह खुश था।
फिलिप कर्न्स

5

मेरे पास कस्टम रंग के संकेत के साथ एक ही मुद्दा था, भले ही मैं रंग कोड के भीतर \[और \]सीमांकक शामिल था। यह पता चला है कि बैश में फंक्शन के अंदर से रंगों को गूँजने की समस्या है । मैंने अपने प्रॉम्प्ट के लिए बस चर का उपयोग करके समाप्त किया, और हालांकि मेरा .bashrc थोड़ा कम सुरुचिपूर्ण है, अब सब कुछ अच्छी तरह से काम करता है।


यदि कोई भी इसे पढ़ रहा है, तो वास्तव में एक समारोह में रंगों से बचना संभव है। जुड़े सवाल पर यह जवाब देखें ।
wjandrea

3

PS1 सेट करने से पहले एक सरल बात निम्नलिखित होगी:

stty columns 1000

उदाहरण के लिए,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

हालाँकि यह अन्य यूनिक्स कमांड जैसे कि ls और man को प्रभावित करता है।


1
जो OSX में काम करता है।
raskhadafi

4
यह भी बुरी तरह से प्रभावित करता है। कृपया इसका उपयोग न करें।
सितंबर को प्रातः

0

Tmux में कनेक्ट होने पर मुझे यह समस्या हुई। समस्या यह थी कि मेरा ipythonबैकग्राउंड में एक सेशन था ( ctrl + z) और वह किसी तरह से लाइन रैपिंग तोड़ रहा था। जैसे ही मैंने इसे समाप्त किया ( fg, ctrl+d+d) मेरे टर्मिनल ने ठीक से काम करना शुरू कर दिया

तो किसी भी बंद इंटरैक्टिव संकेतों के लिए जाँच करें।


0

तो मैं बस उस पर एक मामूली मोड़ के साथ एक ही मुद्दा था और मुझे लगा कि मैं अपना समाधान भी साझा करूंगा, बस मुझे अपने छोटे घमंड को जोड़ने के लिए: डी

मेरा प्रारंभिक PS1 था

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

मेरे पास समस्या यह थी कि मैं अपने टर्मिनल शीर्षक के साथ-साथ कमांड प्रॉम्प्ट को बदलने की कोशिश कर रहा था । जिस तरह से मैंने ऐसा किया \[\033]0;\]Title\aवह PS1 चर में जोड़कर था ।

तो अब मेरा PS1 था:

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

इसने मेरे लिए लपेटने वाली रेखा को गड़बड़ कर दिया। मैं अंत में समझ गया कि बैश अंत में पसंद नहीं करता है \a। इसे दरकिनार करने के लिए, मैंने शीर्षक को एक चर में रखा, जो इसे ठीक करने के लिए लग रहा था।

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"

0

\[और \]मेरे लिए काम नहीं किया। मुझे लगता है कि मैं कैसे (बाहरी कार्यक्रम से) शीघ्र उत्पन्न कर रहा था, या क्योंकि मेरा संकेत "गतिशील" था, इसके बारे में कुछ अलग था।

बाद यह पढ़ मैंने पाया कि आप वास्तव में के साथ रंग कोड बच सकते हैं 0x01और 0x02बाइट्स।

उदाहरण के लिए मैं चाक का एक विशेष संस्करण उपयोग कर रहा हूं और मैं इस का उपयोग करते हुए रंगों को लपेटता हूं:

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.