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 -e
flagi 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.
Odpowiedzi:
$'…'
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 AshENABLE_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/sh
domyś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.Pamiętaj, że
\e
nie jest przenośny. Jest obsługiwany przez wiele implementacji,printf
ale 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.
źródło
\e
nie będziesz obsługiwanydash
?dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'
wydrukujeprintf is a shell builtin
tutaj pogrubioną czerwoną czcionką (kreska-0,5.8). Powłoka, która nie obsługuje\e
toyash
.\e[1;31mprintf is a shell builtin \e[m
tutaj. 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.$'...'
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:Z tego, co dostałem tutaj na mojej tarczy Debiana,
ksh2020
AT&T rozumie$'\U1F600'
. To jedyna „oficjalna” skorupa Korna, jaką mogę dostać w tej nowej dystrybucji.mksh
przeanalizował 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.źródło
$'...'
i iirc był pierwszym, który to zrobił.ksh2020
nie pochodzi z AT&T. Kilka osób, jedna z Red Hat, porwała kilka lat temu drzewo github AT&T AST iksh93