เชลล์อื่นที่ไม่ใช่ Bash และ Zsh สนับสนุนการอ้างอิง ANSI-C หรือไม่ เช่น $ 'string'


13

ฉันมีเชลล์สคริปต์ที่ใช้สิ่งต่อไปนี้เพื่อพิมพ์เครื่องหมายถูกสีเขียวในผลลัพธ์:

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

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

หลังจากที่ได้อ่านเกี่ยวกับการทุบตีของANSI-C Quotingผมรู้ว่าผมสามารถใช้มันเมื่อตั้งค่าตัวแปรสีของฉันและเอา-eธงจากฉันก้อง

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

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

ดูเหมือนว่าน่าสนใจเพราะมันหมายถึงข้อความที่พิมพ์อย่างถูกต้องไม่ว่ามันจะถูกส่งผ่านไปยังเสียงสะท้อนในตัวของ Bash หรือการใช้งานภายนอก/bin/echo(ฉันใช้บน macOS)

แต่สิ่งนี้ทำให้สคริปต์พกพาน้อยลงหรือไม่ ฉันรู้ว่า Bash และ Zsh สนับสนุนรูปแบบการอ้างอิงนี้ แต่ฉันไม่แน่ใจเกี่ยวกับคนอื่น


ใช่ตั้งแต่เมื่อ ksh และรูปแบบที่สนับสนุนเท่านั้น แต่ IIRC การอ้างอิง ANSI-C นั้นจะอยู่ในข้อมูลจำเพาะ POSIX ถัดไป
cuonglm

คำตอบ:


12

$'…'เป็นคุณสมบัติ ksh93 ที่มีอยู่ใน zsh, bash, mksh, FreeBSD sh และในบางรุ่นของ BusyBox sh (BusyBox ที่สร้างด้วยENABLE_ASH_BASH_COMPAT) มันยังไม่ปรากฏในภาษา POSIX sh เชลล์แบบบอร์นทั่วไปที่ไม่มีมันมีเส้นประ (ซึ่งเป็น/bin/shค่าเริ่มต้นบน Ubuntu ในหมู่อื่น ๆ ), ksh88, เชลล์บอร์น, NetBSD sh, yash, อนุพันธ์ของ pdksh นอกเหนือจาก mksh และบางรุ่นของ BusyBox

printfวิธีแบบพกพาที่จะได้รับเครื่องหมายทับขวาตัวอักษรและทับขวา-ฐานแปดแยกวิเคราะห์เป็นตัวควบคุมคือการใช้งาน มันมีอยู่ในทุกระบบที่สอดคล้องกับ POSIX

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

โปรดทราบ\eว่าไม่ได้พกพา มันรองรับการใช้งานหลายprintfอย่าง ใช้รหัสฐานแปดแทน

¹ ได้รับการสนับสนุนใน Debian และตราสารอนุพันธ์ที่จัดส่งอย่างน้อย 0.5.8-2.4 เช่นตั้งแต่ Debian stretch และ Ubuntu 17.04


คุณแน่ใจเกี่ยวกับ\eไม่ได้รับการสนับสนุนในdash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'จะพิมพ์printf is a shell builtinตัวหนาสีแดงที่นี่ (เส้นประ -0.8.8) เปลือกที่ไม่สนับสนุนการมี\e yash
mosvy

@mosvy พิมพ์\e[1;31mprintf is a shell builtin \e[mที่นี่ Ubuntu 16.04, เส้นประ 0.5.8-2.1ubuntu2 พิมพ์เป็นสีแดงบน Ubuntu 18.04 ด้วยเส้นประ 0.5.8-2.10 ดูเหมือนว่า Ubuntu จะทำการปะแก้เพื่อรองรับ
Gilles 'หยุดความชั่วร้าย'

ใช่ขอโทษดูเหมือนว่าจะเป็นเดเบียน (ยืดได้ 9.7) นี่คือต้นฉบับ
mosvy

0

ระดับของ$'...'การสนับสนุนจะต้องนำมาพิจารณาด้วยเมื่อทำการพอร์ต ข้อเสนอ POSIX Folks' ที่จะใส่ในการดวลจุดโทษ POSIXกล่าวถึงหนึ่งโดยเฉพาะ:

stephane: ksh93 เป็นเชลล์ $ '... ' มาจาก (ในขณะที่$'\uxxxx'[ และ$'\Uxxxxxxxx' ] มาจาก zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

จากสิ่งที่ผมได้ที่นี่ในเป้า Debian ของฉันksh2020จาก AT & T $'\U1F600'เข้าใจ นี่เป็น Korn shell อย่างเป็นทางการเพียงตัวเดียวที่ฉันจะได้รับจาก distro ใหม่นี้

mkshแยกวิเคราะห์ แต่ไม่เรียบร้อยโดยสิ้นเชิงด้วย U + FFFE เนื่องจากมันไม่ได้บ่นเกี่ยวกับข้อผิดพลาดทางไวยากรณ์จึงต้องมีบางอย่างผิดปกติกับการเข้าใจ Unicode มันจัดการได้$'\U01F60'ดี


น่าเสียดายที่ผลของการรัฐประหารเมื่อไม่นานมานี้ksh2020 ได้หายไป แต่ใช่ ksh93 ดั้งเดิมให้การสนับสนุน$'...'และ iirc เป็นคนแรกที่ทำได้
mosvy

@ Arthur2e5 ksh2020ไม่ได้มาจาก AT&T ผู้คนสองสามคนจาก Red Hat ถูกจี้ต้นไม้ Gitub ของ AT&T AST เมื่อสองสามปีก่อนและอ้างว่าสามารถควบคุมksh93การพัฒนาในอนาคตได้
fpmurphy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.