Jaki typ sekwencji to sekwencje specjalne rozpoczynające się od „\ 033]”

19

Znalazłem wiele sekwencji ucieczki w Bash, zaczynając od \033], ale czym są te sekwencje i dlaczego się zaczynają \033]?

Sessho
źródło

Odpowiedzi:

25

Sznurek jest właściwie \033[i to nie wszystko.

Po tym otworze otwierającym pojawia się seria cyfr i symboli. Ciąg ten nazywany jest sekwencją zmiany znaczenia i służy między innymi do kontrolowania kursora i koloru tekstu konsoli.

niedrukowalne sekwencje specjalne muszą być zawarte w \[\033[ and \]

Jeśli sekwencja zmiany znaczenia kontroluje kolor tekstu, po nim następuje znak m.

Oto tabela sekwencji kolorów:

Black       0;30     Dark Gray     1;30  
Blue        0;34     Light Blue    1;34  
Green       0;32     Light Green   1;32  
Cyan        0;36     Light Cyan    1;36  
Red         0;31     Light Red     1;31  
Purple      0;35     Light Purple  1;35  
Brown       0;33     Yellow        1;33  
Light Gray  0;37     White         1;37   

Jeśli więc chcesz, aby monit konsoli był niebieski, zastosuj następującą sekwencję zmiany znaczenia (w nazwie pliku, której zapominam):

\[\033[34m\]

(Zauważ m)

Ta sekwencja ucieczki nie tylko kontroluje kolor. Może także kontrolować ruch kursora. Oto tabela / lista z kodami ruchu i ich działaniem:

  • Ustaw kursor:

    \033[<L>;<C>H

    Lub

    \033[<L>;<C>f

    umieszcza kursor w linii L i kolumnie C.

  • Przesuń kursor w górę o N linii:

    \033[<N>A
  • Przesuń kursor w dół N linii:

    \033[<N>B
  • Przesuń kursor do przodu N kolumn:

    \033[<N>C
  • Przesuń kursor do tyłu o N kolumn:

    \033[<N>D
  • Wyczyść ekran, przejdź do (0,0):

    \033[2J
  • Usuń do końca linii:

    \033[K
  • Zapisz pozycję kursora:

    \033[s
  • Przywróć pozycję kursora:

    \033[u

Pamiętaj tylko, że dwa ostatnie mogą nie działać w używanym emulatorze terminali. Najwyraźniej tylko xtermi nxtermużyj tych dwóch sekwencji.

I przykład, używając jednej z tych sekwencji ucieczki: powiedz, że chcę ustawić kursor w wierszu 3, kolumnie (znaku) 9. W tym celu użyłbym

\[033\[3;9H]

(Zakładam, że kolumna 0 to pierwsza pozycja, więc byłby to ósmy znak).

Źródło: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (czytaj także 6.2)

Bardziej ogólne czytanie: http://ascii-table.com/ansi-escape-sequences.php

Wikipedia: https://en.wikipedia.org/wiki/ANSI_escape_code

Wędrowiec
źródło
2
rozważ również link do strony en.wikipedia.org/wiki/ANSI_escape_code
cat
2
Zauważ, że „\ 033” jest znakiem ósemkowym ESCAPE, więc może być podany w postaci dziesiętnej (27) lub szesnastkowej (0x1B). Istnieją inne popularne sposoby pisania ESCAPE, np. „^ [” W skryptach powłoki, „\ e” w bindkey itp.
jamesqf
1
Należy pamiętać, że pewna liczba wpisów w tej tabeli jest wprowadzająca w błąd lub niedokładna: pogrubienie, wyblaknięcie, podkreślenie itp. Można ustawić i zresetować niezależnie od koloru, a także zeruje się je wraz z kolorami; istnieje cały osobny zestaw kodów (40–49) dla tła, a 7 zamiast tego zamienia pierwszy plan i tło; ESC [2Kusuwa całą linię zarówno przed, jak i po kursorze. O wiele lepszym źródłem byłby artykuł z Wikipedii lub można przejść bezpośrednio do ECMA-48 , sekcja 8.3.117 SGR - Wybierz wersję graficzną .
deltab
Wyrażenie „m” na końcu każdego z poniższych zdań jest używane jako znak stop ” w poście cplusplus.com jest również nieco mylące, ponieważ poniższa tabela zawiera polecenia, które oczywiście nie są zakończone przez „m”. Właściwie wydaje się to jeszcze bardziej mylące, gdy jest prezentowane na samej górze.
ilkkachu
1
Technicznie prowadzenie 0;sekwencji kolorów nie jest konieczne. To sprawia, że ​​kolor tła jest domyślny przed ustawieniem pierwszego planu. Możesz także ustawić tło za pomocą 4x.
Pozew funduszu Moniki,
17

Są to polecenia sterujące dla terminala.

Terminale były pierwotnie raczej głupimi urządzeniami podłączonymi do portu szeregowego, a nie tymi fantazyjnymi, wielozakładowymi programami GUI z menu, które mamy teraz. Ponieważ otrzymywali tylko strumień znaków (bajtów), nie było wyraźnego rozdziału między danymi (co drukować na ekranie) a poleceniami (jak je wydrukować). Zamiast tego polecenia są reprezentowane specjalnymi znakami kontrolnymi.

Oczywistymi znakami sterującymi są takie rzeczy, jak przesunięcie wiersza (nowa linia), backspace i dźwięk dzwonka, ale bardziej szczegółowe polecenia są podawane jako sekwencje znaków, zaczynające się od ESCznaku (kod 27 w systemie dziesiętnym, 0x1b w systemie szesnastkowym lub ósemkowy 033). Jest często przedstawiany jako ^[lub \033w twoim przykładzie.

Sekwencja ESC [nazywa się CSI lub wprowadzającym sekwencją kontrolną i rozpoczyna polecenie z opcjonalnymi parametrami numerycznymi, kończąc zwykle literą określającą główne polecenie. Większość typowych sekwencji ucieczki należy do tej klasy.

Listy kodów ucieczki można znaleźć np. Na console_codes(4)stronie man oraz na stronie Wikipedii dla kodów ucieczki ANSI .

Kilka przykładów:

ESC [ 4 A             move cursor 4 lines up (4 can be any number)
ESC [ 5 B             move cursor 5 lines down
ESC [ 2 K             erase current line 
ESC [ 30;46 m         set black text (30) on cyan background (46)
ESC [ 0 m             reset color and attributes

Możesz przetestować polecenia za pomocą np. Bash. Za pomocą -eflagi wbudowane echopolecenie akceptuje \033jako reprezentację ESCznaku.

Np. Spowoduje to wydrukowanie kolorowego powitania na środku ekranu, a drugiego w normalnej pozycji kursora:

echo -e '\033[s\033[12;30f\033[30;46m  Hello!  \033[0m\033[uhello'

Sekwencja, o ESC ]której wspomniałeś, to OSC lub polecenie systemu operacyjnego, które jest najczęściej używane w poleceniu do ustawienia tytułu okna xtermi innych, np .:

echo -e '\033]0;new window title\a'

Są też ESC ( A(i inne litery), które ustawiają narodowe zestawy znaków na niektórych terminalach, co może mieć potencjalnie zabawny efekt .

ilkkachu
źródło
8

Klawisz Escape i prawy nawias kwadratowy escape]służą do wprowadzenia polecenia systemu operacyjnego ( OSC).

Znajduje się w ECMA-48 i możesz przeczytać podsumowanie sekwencji kontrolnych używanych przez xterm w Sekwencjach kontrolnych XTerm , np. Do zmiany tytułu okna terminala.

Sekwencje specjalne mogą zaczynać się od różnych postaci. C1 (8-bit) Kontrola Postacie sekcja w xterm sekwencje kontrolne wymienia kilka z nich: CSI(co widać jako escape[, APC, DCS, PM. Powodem inny (drugi) charakteru dlatego, że para (uciec i ]) jest związany z jednobajtowy znak kontrolny używany dla różnych typów sekwencji zmiany znaczenia.

Jeśli przeczytasz specyfikację, zauważysz, że CSIjest używana w kontrolkach z parametrami numerycznymi, a jednocześnie OSCpozwala na napisy. Oprócz samej składni komitet, który stworzył ten standard, miał na myśli zastosowania dla, APCa PMktóre różniły się od DCSi OSC.

Thomas Dickey
źródło
7

Są to tak zwane kody ucieczkowe ANSI i są wymienione na stronie podręcznika dla konsoli_kodów . Nie są one specyficzne dla Bash, ale raczej działają w dowolnej aplikacji konsolowej, o ile terminal je obsługuje (większość emulatorów terminali to robi).

Joey Marianer
źródło
1

„Sekwencje specjalne” opisane w innych odpowiedziach zależą od posiadanego TYPU terminala (najczęściej „ANSI” lub pochodnych / podobnych).

$ echo $TERM  
xterm

Jeśli chcesz pisać skrypty, które są (w pewnym stopniu) NIEZALEŻNE od terminala, ale nadal używają np. Koloru i innych specjalnych funkcji, zapoznaj się z treścią man terminfo.

na przykład

$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."

wydrukuje .test.z testżółtawym tłem i czerwonym kolorem pierwszego planu, a to zadziała dla DOWOLNEGO terminala, który faktycznie może używać kolorów w ten sam sposób.

Aby zobaczyć, co jest faktycznie wydrukowane, włóż je do niego od -t x1ztak, jak w

$ tput sgr0 | od -t x1z  
0000000 1b 28 42 1b 5b 6d                                >.(B.[m<  
0000006

... gdzie wartości są wyświetlane w systemie szesnastkowym (z powodu „x”).

Hannu
źródło