Kiedy próbuję wydrukować kolorowy tekst za pomocą sekwencji ucieczki ANSI za pomocą wbudowanego echo
polecenia, wydaje się, że \e
sekwencja ucieczki w ciągu, który podam, jest interpretowana dosłownie zamiast jako „ucieczka”, którą ma reprezentować. Dzieje się tak tylko w systemie Snow Leopard - poniższe przykłady działają zgodnie z przeznaczeniem w systemie Leopard.
Najwyraźniej echo
obsługuje -e
przełącznik, ponieważ poprawnie interpretuje \n
podczas używania:
~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
Ale kiedy próbuję użyć \e
, otrzymuję to:
~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
Tak jak mówiłem, u Leoparda powyższe oznaczałoby kolor sznurka „KOLORY”.
Czy ktoś zna powód, dla którego może to być zamierzona zmiana? A co z obejściem drukowania sekwencji ucieczkowych ANSI ze skryptów Bash na Snow Leopard?
Wersja powłoki bash na moim komputerze Leopard jest 3.2.17(1)-release
i 3.2.48(1)-release
na moim komputerze Snow Leopard.
źródło
Odpowiedzi:
Nie mogę ci powiedzieć, dlaczego nie obsługuje tego argumentu (być może będziesz musiał zapytać o to programistów). Wiem tylko, że na moim Linux-ie otrzymuję to:
\e
ucieczkach/bin/echo
z gnu coreutils. Ponieważ Apple od czasu do czasu zmienia źródło swoich składników systemu uniksowego (np. Przejście z zsh na bash), sprawdź, czy nastąpiła zmiana/bin/echo
między Leopardem a Snow Leopardem. Jeśli jest to gnu, możesz zapytać ludzi na gnu.org, dlaczego zdecydowali się nie uwzględniać tych sekwencji.Co do obejścia (to jest bardziej interesujące): Nieużywanie
/bin/echo
, ale wbudowane bashecho
działa na polach linuksowych. Jeśli zmienili się na bash bez wbudowanego echa (lub coś jeszcze bardziej niejasnego), możesz również wypróbować tę mało znaną funkcję powłoki (działa przynajmniej w bash i zsh):Oto pasująca część strony podręcznika bash:
źródło
$'string'
że mogę włączyć sekwencję ucieczki.\e
nie jest częścią standardu POSIX; implementacja GNU coreutils została rozszerzona na ten standard. OS X nie.Spróbuj
\x1B
zamiast\e
.źródło
\x1B
zamiast\e
działa, dzięki.1B
jest to wartość szesnastkowa znaku Escape .Czy
\033
nadal działa? Jeśli nie, możesz nacisnąć Ctrl + V, a następnie klawisz Escape (jeśli Mac ma te klawisze), aby utworzyć prawdziwy znak kontrolny w wierszu poleceń (co oczywiście nie działa dobrze w skryptach, w zależności od edytora)źródło
\033
zamiast\e
działa, dzięki.33
jest ósemkową wartością znaku Escape .033
byłby ustandaryzowanym sposobem pisania ósemki.Innym sposobem drukowania sekwencji ucieczkowych ANSI w powłoce jest użycie
/usr/bin/printf
.źródło
Aby uzupełnić istniejącą pomocną odpowiedź pewnymi informacjami podstawowymi :
Jeśli jesteś Wywoływanie
echo
przez nazwą tylko - w przeciwieństwie do z drogi,/bin/echo
- jesteś powołując się Bash wbudowane zamiast narzędzia zewnętrznego.Zachowanie natywnych elementów Bash, takich jak wbudowane, jest zazwyczaj przenośne w sensie Bash, co oznacza, że powinny one działać tak samo na każdej platformie obsługującej Bash .
\e
to ciekawy wyjątek, który dotyczy wersji 3.x Bash na macOS (do dziś, od wersji 10.13.5 (High Sierra), macOS jest dostarczany z nieaktualnymi wersjami Bash 3.x, ze względów prawnych).\e
(i jego alias\E
) powinien współpracowaćecho -e
;\e
wsparcie zostało dodane doecho
wbudowanego w Bash 2.0 . , ale w niewytłumaczalny sposób nie występuje w wersji podstawowej 3.x na macOS.\e
wykonuje prace w wersji 3.x Bash na innych platformach, takich jak Msys w systemie Windows.I odwrotnie, jeśli zainstalować i używać 4.x atakujących na MacOS,
\e
czyni pracę.źródło
Mogą próbować dostosować się do POSIX: http://www.opengroup.org/onlinepubs/9699919799/
Część OPCJE stanowi między innymi:
źródło
-e
.Do Twojej wiadomości, właśnie dodamy obsługę \ e do / bin / echo i / usr / bin / printf w coreutils. Zauważ, że standardy C nie określają \ e, ale gcc, perl, bash, ksh i tcsh go obsługują
źródło
Możesz sprawdzić, czy `` znaki specjalne inne '' nie zostały zaznaczone w menu opcji widoku terminal.app.
źródło