एक बैश प्रॉम्प्ट के लिए एक फ़ंक्शन में गैर-मुद्रण वर्ण से बच


22

बैश प्रॉम्प्ट (PS1 वैरिएबल) में, मैं प्रॉम्प्ट पर संभावित रूप से टेक्स्ट जोड़ने के लिए एक फंक्शन कह रहा हूं: export PS1="\u@\h \$(my_function) \$ "

हालाँकि, प्रॉम्प्ट में फ़ंक्शन में ANSI रंग कोड होते हैं जो फ़ंक्शन के आउटपुट (कभी-कभी लाल, कभी-कभी हरे) के आधार पर बदलते हैं। \[PS1 चर में " " जोड़ने से गैर-मुद्रण के रूप में उन कोडों से बच जाना चाहिए, लेकिन अगर मैं echoफ़ंक्शन में करता हूं , तो " \[" प्रांप्ट में शाब्दिक रूप से प्रिंट हो जाता है।

मैं कैसे एक झटके में उपयोग के लिए एक समारोह के भीतर से इन एएनएसआई रंग कोड से बच सकते हैं?

जवाबों:


34

ReadLine पुस्तकालय को स्वीकार करता है \001और \002(ASCII एसओएच और एसटीएक्स ) प्रिंट न हो सकने पाठ डिलीमीटर के रूप में। ये किसी भी एप्लिकेशन में भी काम करते हैं जो रीडलाइन का उपयोग करता है ।

से lib/readline/display.c:243में बैश स्रोत कोड:

243 /* Current implementation:
244         \001 (^A) start non-visible characters
245         \002 (^B) end non-visible characters
246    all characters except \001 and \002 (following a \001) are copied to
247    the returned string; all characters except those between \001 and
248    \002 are assumed to be `visible'. */

बैश विशिष्ट \[और \]वास्तव में करने के लिए अनुवाद किया जाता है \001और \002पर y.tab.c:7640


नोट: यदि आप bash का उपयोग करते हैं , printfया echo -eयदि आपका टेक्स्ट किसी नंबर से पहले \001या \002तुरंत है, तो आप एक bash बग मारेंगे, जिससे ऑक्टल बचते समय एक अंक बहुत अधिक खाने का कारण बनता है - अर्थात, \00142इसे ऑक्टल के रूप में व्याख्या किया जाएगा। 014 (इसके बाद ASCII "2"), सही ओक्टल 01 के बजाय (ASCII "42" के बाद)। इस कारण से, हेक्साडेसिमल संस्करणों का उपयोग करें \x01और \x02इसके बजाय।


उसने ऐसा किया! echo -e "\001\e[31m\002RED"उम्मीद के मुताबिक काम करता है। धन्यवाद!
मध्यरात्रि का समय

एक उत्तर को पुनर्जीवित करने के लिए क्षमा करें, लेकिन डैश / ऐश / श के बराबर क्या है?
होश सादिक

@ यदि वे रीडलाइन का उपयोग करते हैं, \001और \002काम करेंगे। नहीं तो मुझे यकीन नहीं है। उदाहरण के लिए डैश निश्चित रूप से रीडलाइन का उपयोग नहीं करता है
वेजेंड्रिया

1

यहाँ एक अच्छा पूरा जवाब है। मुझे यह पता लगाने के लिए बहुत अधिक खुदाई करनी थी कि \ _ 001 आदि को कहां जाना है। उम्मीद है की यह मदद करेगा।

# Color prompt for git
reset=$(tput sgr0)
boldgreen=$(tput setaf 2)$(tput bold)
cyan=$(tput sgr0)$(tput setaf 6)
boldred=$(tput setaf 1)$(tput bold)
boldwhite=$(tput setaf 7)$(tput bold)
boldyellow=$(tput setaf 3)$(tput bold)

PARENCLR=$'\001\e[0;36m\002'
BRANCHCLR=$'\001\e[1;33m\002'

alias branchname="git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/ ${PARENCLR}(${BRANCHCLR}\1${PARENCLR}\)/'"

GIT_STATUS='$(branchname)'

PROMPT_CHAR="\$"
PS1="\[$boldgreen\]\u\[$cyan\]::\[$boldred\]\h \[$cyan\]{\[$boldwhite\].../\W\[$cyan\]}\[$reset\]$GIT_STATUS\[$reset\]$PROMPT_CHAR "

जिस तरह से मैंने इसे यहाँ स्थापित किया है, git शाखा कोष्ठक केवल तभी दिखाई देते हैं यदि आप git शाखा में हैं, अन्यथा यह रिक्त है।


0

ग्रेविटी के उत्तर के आधार पर , निम्नलिखित ASCII SOH( ^A) और STX( ^B) में एएनएसआई नियंत्रण अनुक्रमों को शामिल करेगा जो क्रमशः \[और इसके बराबर \]हैं:

function readline_ANSI_escape() {
  if [[ $# -ge 1 ]]; then
    echo "$*"
  else
    cat  # Read string from STDIN
  fi | \
  perl -pe 's/(?:(?<!\x1)|(?<!\\\[))(\x1b\[[0-9;]*[mG])(?!\x2|\\\])/\x1\1\x2/g'
}

इसका उपयोग करें जैसे:

$ echo $'\e[0;1;31mRED' | readline_ANSI_escape

या:

$ readline_ANSI_escape "$string"

एक बोनस के रूप में, फ़ंक्शन को कई बार चलाने से पहले से बच गए नियंत्रण कोड फिर से नहीं बचेंगे।


-2

यदि आप उन्हें प्रॉम्प्ट में उपयोग करना चाहते हैं, तो आपको करने की आवश्यकता है \[। लेकिन अगर आप इसे इको में उपयोग करना चाहते हैं, तो आपको उपयोग करना होगा \033[


हम्म् ... ANSI कमांड ("\ e [31m") और \ 033] से पहले जोड़ना \ _ "इसके बाद प्रिंट में अगला मुद्रित वर्ण बनाने के लिए लगता है।
मध्यरात्रि का समय

1
आप इसके बाद \ 033] नहीं करना चाहते हैं। \ 033 [31 मी रंग शुरू होता है, उसके बाद आपको इसे वापस सेट करने की आवश्यकता होती है \ 033 [0 मी
वफ़र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.