Co oznacza sekwencja bashowa „\ 033 [999D” i gdzie to wyjaśniono?

19

Natknąłem się na sekwencje bash, takie jak \033[999Di, \033[2K\rktóre służą do pewnych manipulacji na wydruku na terminalu. Ale co oznaczają te sekwencje? Gdzie mogę znaleźć listę / podsumowanie w Internecie, aby pomóc mi znaleźć znaczenie tych sekwencji?

Alex
źródło
3
Są to sekwencje końcowe, a nie sekwencje bash. Musisz spojrzeć na dokumentację terminala, aby określić ich funkcję.
Chris Down
1
Sekwencje te służą do pokolorowania wyniku. Sprawdź: stackoverflow.com/questions/16845699/… i stackoverflow.com/questions/5947742/…
adizere
1
@ Adizere nie wszystkie sekwencje specjalne wykonują zmiany kolorów. Sekwencje w tym Q dotyczą manipulacji liniami i ruchu kursora, a nie koloru.
Casey

Odpowiedzi:

32

Zobacz ten link http://www.termsys.demon.co.uk/vtansi.htm . Jak mówi Anthon, \033 jest to ósemkowy kod w stylu C dla znaku zmiany znaczenia. [999DPrzesuwa kursor z powrotem do 999 kolumn, przypuszczalnie brute force sposób dotarcia do początku wiersza. [2Kusuwa bieżącą linię. \rjest znakiem powrotu karetki, który przeniesie kursor z powrotem na początek bieżącej linii i jest sekwencją ucieczki w stylu C, a nie końcową sekwencją sterującą.

Aktualizacja

Jak zauważyli inni, te sekwencje kontrolne nie są niczym innym, bashjak raczej urządzeniem końcowym / emulatorem, na którym pojawia się tekst. Pewnego razu sekwencje te były interpretowane przez zupełnie inny sprzęt. Początkowo każdy reagował na zupełnie inne zestawy kodów. Aby sobie z tym poradzić, biblioteki termcapi terminfosłużą do pisania kodu zgodnego z wieloma terminalami. tputKomenda jest interfejsem do terminfobiblioteki ( termcapwsparcie może być również zestawiane w) i jest bardziej wydajny sposób na tworzenie kompatybilnych sekwencje.

To powiedziawszy, istnieje również standard ANSI X3.64 lub ECMA-48 . Wykorzysta to każda nowoczesna implementacja terminalu. terminfoi termcapnadal są istotne, ponieważ implementacja może być niekompletna lub zawierać niestandardowe rozszerzenia, jednak dla większości celów można bezpiecznie założyć, że wspólne sekwencje ANSI będą działać.

xterm FAQ zapewnia kilka ciekawych informacji na temat różnic między nowoczesne emulatory terminali (wielu po prostu starają się naśladować xtermsiebie) i jak xtermsekwencje dotyczą terminali VT100 wymienionych w powyższym linku. Zapewnia również ostateczną listę xtermsekwencji kontrolnych .

Oczywiście powszechnie używana jest również konsola Linux, w której można znaleźć ostateczną listę sekwencji kontrolnych man console_codes, wraz z porównaniem do xterm.

Graeme
źródło
Podany link to tylko strona, której szukałem.
Alex
@Alex Cieszę się, że sam to znalazłem, większość stron, które widziałem, obejmują tylko kolory i jakoś są bardzo skomplikowane do czytania. To jest miłe i proste.
Graeme
uważaj, aby działanie kodów specjalnych zależało od rodzaju terminala (i możesz emulować kilka rodzajów terminali na nowoczesnych ekranach / systemach operacyjnych). Zamiast tego możesz użyć tputpoleceń, aby mieć większą przenośność, iirc (ale kosztem mniejszego pokrycia specyfiki twojego terminala). VT100 (ten, o którym mówi strona) jest obsługiwany przez wielu (ale nie wszystko jest obsługiwane, wierzę ...). Ale twoja zmienna TERM może być ustawiona na inny terminal, a to może wpłynąć na działanie niektórych poleceń
Olivier Dulac
@Olivier, poprawne tputjest bardziej niezawodnym sposobem. Ale to raczej kompatybilność ANSI niż konkretny terminal VT100 jest teraz dość wszechobecny, chociaż wydaje mi się, że można ustawić xtermtryb, który ich nie akceptuje. Myślę, że zaktualizuję o kilka więcej informacji na ten temat.
Graeme
@Olivier Wiele emulatorów terminali również ustawia TERM=xtermsię, ale nie implementuje wszystkiego, co xtermrobi.
Graeme
5

Jest \033to znak zmiany znaczenia, a sekwencje te nie są specyficzne dla basha, ale są interpretowane przez terminal (oprogramowanie lub sprzęt (przez sieć lub linię szeregową)), w którym działa program (bash). Istnieje wiele takich sekwencji .

To, co robi każdy, zależy od terminala, od którego jest zależny, i może również zależeć od dowolnej poprzedniej sekwencji zmieniającej stan terminala.

Są one często używane do ustawiania kolorów w oknie zachęty , ale nie znalazłem konkretnych przykładów na tej stronie.

Anthon
źródło
3

„\ 033 [999D” jest zabawny. Niektóre terminale implementują mniej sekwencji ucieczki, więc może to być potrzebne, jeśli żaden z „\ 033 [1G”, „\ 033 [1; 1H”, „\ 033 [1; 1f” lub „\ r” nie zachowuje się tak, jak powinien, ale kto używa wyświetlania tekstu w tysiącach kolumn? Te sekwencje mają stronę podręcznika w systemie Linux: console_codes (4) . bjh21 ma szczegółową listę wszystkich kodów . W zależności od tego, który program analizuje „\ 033”, dostępne może być bardziej wyraźne podstawienie „\ e”.

Naprawdę nie jest zamierzone, aby były one używane bezpośrednio - poprawnym sposobem wydawania poleceń sterujących terminalem jest warstwa abstrakcji, taka jak ncurses - ale działają one równie dobrze z literałów łańcuchowych.

użytkownik130144
źródło
Dobrze, po prostu założyłem, \033[999Dże utworzy kopię zapasową w stosunku do poprzedniej linii. Może być to jednak wynikiem podejrzanego kodowania;) Możesz także bashbezpośrednio interpretować kody ucieczki, np.$'\033[999D'
Graeme