Czy powłoki inne niż Bash i Zsh obsługują cytowanie ANSI-C? np. $ „string”


13

Mam skrypt powłoki, który używa następującego polecenia do wydrukowania zielonego znacznika wyboru w danych wyjściowych:

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

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

Po przeczytaniu o cytowaniu ANSI-C Basha , zdałem sobie sprawę, że mogę go użyć do ustawienia zmiennych kolorów i usunięcia -eflagi z mojego echa .

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

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

Wydaje się to atrakcyjne, ponieważ oznacza, że ​​wiadomość jest drukowana poprawnie, niezależnie od tego, czy jest przekazywana do wbudowanego echa Basha, czy do zewnętrznego urządzenia /bin/echo(jestem na macOS).

Ale czy to sprawia, że ​​skrypt jest mniej przenośny? Wiem, że Bash i Zsh obsługują ten styl cytowania, ale nie jestem pewien co do innych.


Tak, ponieważ kiedy tylko ksh i jego odmiany obsługują go na razie. Ale cytowanie IIRC, ANSI-C będzie w następnej specyfikacji POSIX.
cuonglm

Odpowiedzi:


12

$'…'jest funkcją ksh93, która jest również obecna w Zsh, Bash, MKK, FreeBSD SH oraz w niektórych wersjach BusyBox SH (zbudowany z BusyBox Ash ENABLE_ASH_BASH_COMPAT). Nie jest jeszcze obecny w języku sh POSIX. Typowe powłoki Bourne'a, które go nie mają, to dash (który jest /bin/shdomyślnie między innymi Ubuntu), ksh88, powłoka Bourne'a, NetBSD sh, yash, pochodne pdksh inne niż mksh i niektóre kompilacje BusyBox.

Można użyć przenośnego sposobu analizowania liter odwróconego ukośnika i ósemki odwrotnej jako znaków kontrolnych printf. Jest obecny we wszystkich systemach zgodnych z POSIX.

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

Pamiętaj, że \enie jest przenośny. Jest obsługiwany przez wiele implementacji, printfale nie przez tę z dash¹. Zamiast tego użyj kodu ósemkowego.

¹ Jest obsługiwany w Debianie i wersjach pochodnych, które dostarczają co najmniej 0,5.8-2,4, np. Od wersji Debian stretch i Ubuntu 17.04.


czy na pewno \enie będziesz obsługiwany dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'wydrukuje printf is a shell builtintutaj pogrubioną czerwoną czcionką (kreska-0,5.8). Powłoka, która nie obsługuje \eto yash.
mosvy

@mosvy Drukuje \e[1;31mprintf is a shell builtin \e[mtutaj. Ubuntu 16.04, dash 0.5.8-2.1ubuntu2. Drukuje na czerwono na Ubuntu 18.04 z myślnikiem 0.5.8-2.10. Wygląda na to, że Ubuntu stworzyło łatkę, która go obsługuje.
Gilles „SO- przestań być zły”

Tak, przepraszam, wygląda na to, że jest to łatka debian (9.7 stretch). oto oryginał.
mosvy

0

$'...'Podczas przenoszenia należy również wziąć pod uwagę stopień wsparcia. Propozycja POSIX Folks, aby umieścić to w POSIX, wymienia w szczególności jedną z nich:

stephane: ksh93 to powłoka $ '... ... pochodzi z (podczas gdy $'\uxxxx'[ i$'\Uxxxxxxxx' ] pochodzi z zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

Z tego, co dostałem tutaj na mojej tarczy Debiana, ksh2020AT&T rozumie $'\U1F600'. To jedyna „oficjalna” skorupa Korna, jaką mogę dostać w tej nowej dystrybucji.

mkshprzeanalizował go, ale całkowicie spartaczył go U + FFFE. Ponieważ nie narzekał na błąd składniowy, musi być coś nie tak ze zrozumieniem Unicode. Poradzi $'\U01F60'sobie dobrze.


Niestety, w wyniku niedawnego zamachu stanu ksh2020 zniknął. Ale tak, oryginalny ksh93 obsługuje $'...'i iirc był pierwszym, który to zrobił.
mosvy

@ Arthur2e5. ksh2020nie pochodzi z AT&T. Kilka osób, jedna z Red Hat, porwała kilka lat temu drzewo github AT&T AST i ksh93
przejęła
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.