Odpowiedzi:
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 xterm
i nxterm
uż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
[2K
usuwa 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ą .
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
.
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 ESC
znaku (kod 27 w systemie dziesiętnym, 0x1b w systemie szesnastkowym lub ósemkowy 033). Jest często przedstawiany jako ^[
lub \033
w 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ą -e
flagi wbudowane echo
polecenie akceptuje \033
jako reprezentację ESC
znaku.
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 xterm
i 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 .
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 CSI
jest używana w kontrolkach z parametrami numerycznymi, a jednocześnie OSC
pozwala na napisy. Oprócz samej składni komitet, który stworzył ten standard, miał na myśli zastosowania dla, APC
a PM
które różniły się od DCS
i OSC
.
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).
„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 x1z
tak, 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”).