बैश और Zsh के अलावा अन्य गोले ANSI-C के समर्थन में हैं? $ 'स्ट्रिंग' जैसे


13

मेरे पास एक शेल स्क्रिप्ट है जो अपने आउटपुट में हरे चेकमार्क को प्रिंट करने के लिए निम्नलिखित का उपयोग करता है:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

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

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

यह आकर्षक लगता है, क्योंकि इसका मतलब है कि संदेश सही ढंग से प्रिंट करता है चाहे वह बैश के बेसिन इको या बाहरी उपयोग के लिए पारित हो /bin/echo(मैं macOS पर हूं)।

लेकिन क्या यह स्क्रिप्ट को कम पोर्टेबल बनाता है? मुझे पता है कि बैश और जेडश, उद्धृत करने की इस शैली का समर्थन करते हैं, लेकिन मैं दूसरों के बारे में निश्चित नहीं हूं।


हाँ, जब से केवल ksh और उसके रूपांतर अब इसके लिए समर्थन करते हैं। लेकिन IIRC, ANSI-C उद्धरण अगले POSIX कल्पना में होने जा रहा है।
कोउन्ग्लम

जवाबों:


12

$'…'ksh93 एक विशेषता है जो कि zsh, bash, mksh, FreeBSD sh में और बिजीबॉक्स sh के कुछ बिल्ड्स (बिजीबॉक्स ऐश के साथ ENABLE_ASH_BASH_COMPAT) में भी मौजूद है। यह अभी तक POSIX श भाषा में मौजूद नहीं है। कॉमन बॉर्न-जैसे गोले, जिनमें डैश नहीं होता है (जो कि /bin/shदूसरों के बीच उबंटू में डिफ़ॉल्ट रूप से होता है), ksh88, बॉर्न शेल, नेटबीएसडी श, यश, mdh के अलावा pdksh का डेरिवेटिव और बिजीबॉक्स के कुछ बिल्ड शामिल हैं।

बैकस्लैश-लेटर और बैकस्लैश-ऑक्टल प्राप्त करने के लिए एक पोर्टेबल तरीका जिसे नियंत्रण वर्णों का उपयोग करना है printf। यह सभी POSIX- संगत प्रणालियों पर मौजूद है।

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

ध्यान दें कि \eपोर्टेबल नहीं है। यह कई कार्यान्वयनों द्वारा समर्थित है, printfलेकिन डैश में एक के द्वारा नहीं। इसकी जगह ऑक्टल कोड का इस्तेमाल करें।

¹ यह डेबियन में समर्थित है और कहा कि जहाज कम से कम 0.5.8-2.4, जैसे डेबियन खिंचाव और Ubuntu 17.04 के बाद से डेरिवेटिव।


क्या आप इस बारे में सुनिश्चित \eनहीं हैं कि इसमें समर्थन नहीं किया जा रहा है dash? यहां बोल्ड रेड में dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'प्रिंट होगा printf is a shell builtin(डैश-0.5.8)। एक शेल जो समर्थन नहीं करता \eहै yash
मस्जिद

@mosvy \e[1;31mprintf is a shell builtin \e[mयहाँ प्रिंट करता है। Ubuntu 16.04, डैश 0.5.8-2.1ubuntu2। उबंटू 18.04 पर लाल रंग में प्रिंट 0.5.8-2.10 डैश के साथ। ऐसा लगता है कि उबंटू ने इसका समर्थन करने के लिए एक पैच बनाया।
गिलेस एसओ- बुराई को रोकना '

हाँ, क्षमा करें, ऐसा लगता है कि एक डेबियन (9.7 खिंचाव) पैच है। यहाँ मूल है।
मस्जिद

0

$'...'पोर्ट करते समय समर्थन की डिग्री को भी ध्यान में रखना होगा। POSIX लोग 'POSIX श में इस डाल करने के लिए प्रस्ताव विशेष रूप से एक का उल्लेख है:

स्टीफ़न: ksh93 शेल $ है ... '( $'\uxxxx'[[ और$'\Uxxxxxxxx' ] zsh से आता है: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

ksh2020एटीएंडटी से मुझे अपने डेबियन बुलसेय पर जो मिला है, वह समझता है $'\U1F600'। यह एकमात्र "आधिकारिक" कोर्न शेल है जो मुझे इस नए डिस्ट्रो पर मिल सकता है।

mkshइसे पार्स किया लेकिन इसे पूरी तरह से U + FFFE के साथ बॉट किया। चूंकि यह एक सिंटैक्स त्रुटि के बारे में शिकायत नहीं करता था इसलिए इसमें यूनिकोड की समझ के साथ कुछ गड़बड़ है। यह $'\U01F60'ठीक ठीक संभालता है।


दुर्भाग्य से, हाल ही में तख्तापलट के प्रभाव के रूप में ksh2020 को गायब कर दिया गया है। लेकिन हाँ, मूल ksh93 समर्थन करता है $'...'और iirc यह पहली बार किसने किया था।
मूस

@ Arthur2e5। ksh2020एटी एंड टी से नहीं है। कुछ लोगों ने, रेड हैट में से एक, अनिवार्य रूप से कुछ साल पहले एटी एंड टी एएसटी जीथब ट्री को अपहृत किया था और भविष्य के ksh93विकास के नियंत्रण का दावा किया था
fpmurphy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.