Bash ve Zsh dışındaki mermiler ANSI-C teklifini destekliyor mu? örneğin $ 'string'


13

Çıktısında yeşil bir onay işareti yazdırmak için aşağıdakileri kullanan bir kabuk komut dosyası var:

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

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

Bash'in hakkında okuduktan sonra ANSI-C aktaran , benim renk değişkenleri ayarlarken kullanmak ve kaldırmak fark etti -ebenim gelen bayrağı yankı .

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

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

Bu çekici görünüyor, çünkü mesaj Bash'in yerleşik yankısına veya harici util'e /bin/echo(macOS'tayım) iletilip iletilmediğini doğru bir şekilde yazdırdığı anlamına geliyor .

Ancak bu komut dosyasını daha az taşınabilir hale getirir mi? Bash ve Zsh'ın bu alıntı türünü desteklediğini biliyorum, ama başkalarından emin değilim.


Evet, çünkü sadece ksh ve varyasyonları şimdilik destekliyor. Ancak IIRC, ANSI-C alıntıları bir sonraki POSIX spesifikasyonunda olacak.
cuonglm

Yanıtlar:


12

$'…'ayrıca zsh, bash, mksh, FreeBSD sh ve BusyBox sh (BusyBox kül ile inşa edilmiş ENABLE_ASH_BASH_COMPAT) bazı yapılarında bulunan bir ksh93 özelliğidir . Henüz POSIX sh dilinde mevcut değil. Ortak Bourne benzeri kabuklar arasında çizgi ( /bin/shvarsayılan olarak Ubuntu'da diğerleri arasındadır), ksh88, Bourne kabuğu, NetBSD sh, yash, mksh dışındaki pdksh türevleri ve bazı BusyBox yapıları bulunur.

Denetim karakterleri olarak ters eğik çizgi ve ters eğik çizgi-sekizli ayrıştırmanın taşınabilir bir yolu kullanmaktır printf. POSIX uyumlu tüm sistemlerde bulunur.

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

\eTaşınabilir olmadığını unutmayın . printfDash in birçok uygulaması tarafından desteklenir, ancak desteklenmez¹ . Bunun yerine sekizli kodu kullanın.

¹ Debian desteklenir ve türevleri Debian streç ve Ubuntu 17.04 yana geminin en az 0.5.8-2.4, örneğin yani.


\edesteklenmediğinden emin misin dash? burada koyu kırmızı renkte dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'yazdırılır printf is a shell builtin(tire-0.5.8). Desteklemeyen bir kabuk \eolduğunu yash.
mosvy

@mosvy Buraya yazdırır \e[1;31mprintf is a shell builtin \e[m. Ubuntu 16.04, tire 0.5.8-2.1ubuntu2. Ubuntu 18.04 üzerinde tire 0.5.8-2.10 ile kırmızı renkte yazdırır. Görünüşe göre Ubuntu onu desteklemek için bir yama yaptı.
Gilles 'SO- kötü olmayı bırak'

Evet, üzgünüm, görünüşe göre bu bir debian (9.7 streç) yaması. işte orijinal.
mosvy

0

Taşıma sırasında $'...'destek derecesinin de dikkate alınması gerekir. POSIX sh bu koymak için POSIX Folks' önerisi özellikle bir bahseder:

stephane: ksh93 $ '...' gelen kabuktur ( $'\uxxxx'[ ve$'\Uxxxxxxxx' ] zsh'den geliyor: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

Debian bullseye'mda bulduğumdan ksh2020AT&T anlıyor $'\U1F600'. Bu, bu yeni dağıtımda alabileceğim tek "resmi" Korn kabuğu.

mkshayrıştırdı ama tamamen bir U + FFFE ile doldurdu. Bir sözdizimi hatası hakkında şikayet etmediğinden, Unicode'u anlamasıyla ilgili yanlış bir şey olmalı. Bu işler $'\U01F60'sadece para cezası.


Ne yazık ki, son bir darbenin bir etkisi olarak ksh2020 ortadan kayboldu. Ama evet, orijinal $'...'ksh93 destekliyor ve bunu ilk yapan kişi oldu.
mosvy

Arthur2e5 @. ksh2020AT&T'den değil. Red Hat'tan bir çift, birkaç yıl önce AT&T AST github ağacını kaçırdı ve gelecekteki ksh93gelişimin kontrolünü talep etti
fpmurphy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.