बैश: कैसे पता करें कि अंतिम कमांड का आउटपुट एक नई सीमा के साथ समाप्त होता है या नहीं?


10

अधिकांश समय एक कमांड का आउटपुट न्यूलाइन वर्ण के साथ समाप्त होता है। लेकिन कभी-कभी यह नहीं होता है, इसलिए अगला शेल प्रॉम्प्ट आउटपुट के साथ एक ही पंक्ति में मुद्रित होता है।

उदाहरण:

रूट @ होस्टनाम [~] # इको-एन हेलो
हेलोरूट @ होस्टनाम [~] #

मैंने हमेशा पाया है कि बहुत कष्टप्रद है।
अब, मैं पीएस 1 चर की शुरुआत में सिर्फ एक "\ n" जोड़ सकता था, लेकिन अधिकांश समय जो एक अतिरिक्त पंक्ति को प्रिंट करेगा, जिसकी मुझे आवश्यकता नहीं है।

क्या यह जानना संभव है कि अंतिम कमांड का आउटपुट एक नई सीमा के साथ समाप्त हुआ या नहीं?


समाधान:
(डेनिस के लिए धन्यवाद)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

इसे सुपरसुसर में स्थानांतरित किया जाना चाहिए।
42फिंक

मुझे आपका संस्करण पसंद है! आपने $()एक स्थान पर उपयोग किया और दूसरे में बैकटिक्स। आप $()दोनों में उपयोग कर सकते हैं ।
अगली सूचना तक रोक दिया गया।

मुझे पता है। लेकिन मेरे लिए इस तरह पढ़ना आसान है
GetFree

मैं उपयोग नहीं करूंगा tput colsक्योंकि यह सिर्फ वैसे भी COLUMNS वैरिएबल के मूल्य को आउटपुट करता है, और यह धीमा है क्योंकि यह शेल बिल्डिन नहीं है। आप सम्मिलित व्हाट्सएप को हटाने के \e[Kलिए (समतुल्य tput el) शामिल करना चाहते हैं ताकि आपको डिफ़ॉल्ट मामले में कॉपी और पेस्ट करते समय व्हाट्सएप को पीछे करने का एक गुच्छा न मिले। अंत में, आपको इस सभी जादू के बीच संलग्न करने की आवश्यकता है \[और \]अन्यथा बैश आपके कर्सर की स्थिति का दूसरा अनुमान लगाने की कोशिश करेगा और जब आप अपने आदेश / इतिहास को संपादित करेंगे तो यह गड़बड़ हो जाएगा।
dlitz

1
पूरी तरह से किया जा सकता है:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

जवाबों:


6

मैं zshबैश से फीचर का अनुकरण करने के लिए निम्नलिखित प्रयोग कर रहा हूं :

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

यह एक रिवर्स वीडियो प्रतिशत संकेत जारी करता है, इसके बाद रिक्त स्थान का एक गुच्छा इसे अगली पंक्ति में लपेटने के लिए बनाता है, फिर एक गाड़ी वापस आती है, इसके बाद एक डॉलर चिह्न और एक स्थान होता है। आप अपने प्रॉम्प्ट को कस्टमाइज़ करने के लिए "\ 015" के बाद शीघ्र पलायन जोड़ सकते हैं।

इसका उपयोग करना इस बात पर निर्भर करता है कि आपका टर्मिनल सही मार्जिन लाइन रैपिंग (स्वचालित मार्जिन) को कैसे संभालता है। PROMPT_SP की लंबाई मनमानी है, लेकिन कम से कम 80 या आपके सामान्य टर्मिनल की चौड़ाई जो भी होनी चाहिए। यदि $ COLUMNS forलूप में चलने के समय तक अभी तक सेट नहीं किया गया है, तो आपको उस मूल्य-कोड की आवश्यकता हो सकती है ~/.bashrc। यदि आप shopt -s checkwinsizeपहले से सेट नहीं हैं, तो आप चाहते हैं ।


मुझे आश्चर्य है कि किसी ने प्रत्येक उत्तर को क्यों अस्वीकृत कर दिया । हम्मम ... कोई स्पष्टीकरण नहीं। कितना मददगार।
अगली सूचना तक रोक दिया गया।

यहां एक और तरीका है, बिना लूप का उपयोग किए, पैड स्ट्रिंग बनाने के लिए:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
आगे की सूचना तक रोक दिया गया।

"रिवर्स वीडियो प्रतिशत संकेत" क्या है? "वीडियो" शब्द ने मुझे भ्रमित कर दिया है, और मैं Google पर इसका उत्तर नहीं ढूंढ पाया हूं।
davidchambers

1
@davidchambers: चरित्र की पृष्ठभूमि को अग्रभूमि रंग में प्रदर्शित किया जाता है और चरित्र स्वयं पृष्ठभूमि रंग में प्रदर्शित होता है। man 5 terminfoइस शब्दावली का उपयोग करने वाले कुछ दस्तावेज़ों को देखने के लिए "रिवर्स वीडियो" देखें और खोजें।
अगली सूचना तक रोक दिया गया।

0

नहीं, यह संभव नहीं है। बैश खुद उस प्रोग्राम के आउटपुट को प्रोसेस या नहीं देखता है जो उसने शुरू किया है।

यह मेरे लिए सिर्फ यह है कि इसे सेट करने के लिए एक प्रोग्राम लिखना संभव हो सकता है PROMPT_COMMAND, जो कर्सर की वर्तमान स्थिति की जांच करेगा और कर्सर के बाएं किनारे पर नहीं होने पर एक नई लाइन जारी करेगा।


अच्छा विचार। एकमात्र समस्या यह है ... क्या कर्सर की स्थिति जानना संभव है?
GetFree

0

zshआपकी समस्या को हल करने की कोशिश करता है। यदि अंतिम आउटपुट बिना किसी नई पंक्ति के समाप्त होता है, तो आपको मिलेगा:

$ echo -n 'abc'
abc%
$ 

जहां %उल्टे पृष्ठभूमि / अग्रभूमि का उपयोग किया जाता है। यकीन नहीं होता अगर यह bashकिसी भी तरह से पोर्टेबल है ।

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