Różnica między \ e a ^ [


15

Gilles napisał :

znak 27 = 033 = 0x1b = ^[=\e

Demizey napisał :

^ [jest tylko reprezentacją ESCAPE, a \ e jest interpretowane jako rzeczywisty znak ESCAPE

Potem też znalazłem ten wiersz z artykułu TechRepublic

Pamiętaj, aby zapisać sekwencję klawiszy jako \ e [24 ~ zamiast ^ [[24 ~. Jest tak, ponieważ sekwencja ^ [jest równoważna z klawiszem [Esc], który jest reprezentowany przez \ e w powłoce. Na przykład, jeśli sekwencją klawiszy była ^ [[OP, wynikowy kod powiązania do użycia to \ e [OP.

Ale używam mapowań, które używają ^ [zamiast \ e.

Czy są więc wymienne? Kiedy muszę użyć jednego zamiast drugiego?

Odpowiedzi:


16

Jeśli spojrzysz na standard ANSI ASCII , dolna część zestawu znaków (pierwsze 32) są zarezerwowanymi „znakami kontrolnymi” (czasami nazywanymi „sekwencjami ucieczki”). Są to rzeczy takie jak znak NUL, Life Feed, Carriage Return, Tab, Bell, itp. Zdecydowaną większość można emulować, naciskając Ctrlklawisz w połączeniu z innym klawiszem.

Sekwencja 27 (dziesiętna) lub \033ósemkowa lub 0x1bszesnastkowa to sekwencja Escape. Wszystkie są reprezentacjami tej samej sekwencji kontrolnej. Różne powłoki, języki i narzędzia odnoszą się do tej sekwencji na różne sposoby. Jego Ctrlsekwencja jest Ctrl- [, a zatem czasem są reprezentowane ^[, ^są skróty dla Ctrl.

Możesz wprowadzić kontrolne sekwencje znaków jako nieprzetworzone sekwencje w linii poleceń, kontynuując je za pomocą Ctrl- v. Ctrl- vdla większości powłok i programów zatrzymuje interpretację następującej sekwencji klawiszy i zamiast tego wstawia ją w surowej postaci. Jeśli zrobisz to za pomocą Escapeklawisza lub Ctrl- vwyświetli się na większości powłok jako ^[. Jednak chociaż sekwencja ta zostanie zinterpretowana, nie będzie łatwa do wycinania i wklejania, a może zostać zredukowana do niekontrolowanej sekwencji znaków, gdy napotka niektóre protokoły lub programy.

Aby obejść ten problem, aby ułatwić korzystanie z niego, niektóre narzędzia reprezentują sekwencję „surową” za pomocą \033(poprzez odniesienie ósemkowe), odniesienie szesnastkowe \x1blub odniesienie do znaku specjalnego \e. Jest to w podobny sposób \tinterpretowane jako Tab- które, nawiasem mówiąc, można również wprowadzać przez Ctrl- i, lub \njako znak nowej linii lub Enterklawisz, który można również wprowadzać przez Ctrl- m.

Więc kiedy Gilles mówi:

27 = 033 = 0x1b = ^ [= \ e

Mówi dziesiętny ASCII 27, ósemkowy 33, szesnastkowy 1b, Ctrl- [i \ewszystkie są równe, co oznacza, że ​​wszystkie odnoszą się do tej samej rzeczy (semantycznie).

Kiedy mówi Demizey

^ [jest tylko reprezentacją ESCAPE, a \ e jest interpretowane jako rzeczywisty znak ESCAPE

Oznacza on semantycznie, ale po naciśnięciu Ctrl- v Ctrl- [to jest dokładnie taka sama, jak \esurowy włożona sekwencja najprawdopodobniej będzie traktowane w ten sam sposób, ale to nie zawsze jest zagwarantowane, i dlatego zaleca się stosowanie programowo bardziej przenośne \elub 0x1blub \033w zależności od używanego języka / powłoki / narzędzia.


4

Wszystkie są reprezentacjami tej postaci, której używa niektóre oprogramowanie lub niektórzy ludzie. Wymieniłem te najczęstsze. Jeśli rozmawiasz z człowiekiem, użyj tego, co zrozumieją. (Najwyraźniej moja próba upewnienia się, że zrozumiesz co najmniej jeden z tych błędów.) Jeśli mówisz do oprogramowania, zapoznaj się z dokumentacją, aby dowiedzieć się, co ono rozumie.

W bash, sekwencje ucieczki \e, \033i \x1bpracy jako argument printf, w $'…', w podpowiedzi, w kluczowych wiązań. W powiązaniach klawiszy istnieje bardziej ogólna składnia, \C-[która działa, ponieważ znak 27 jest tym, co otrzymujesz po wpisaniu Ctrl+ [(ta składnia jest imitacją powiązań klawiszy Emacsa). \033działa we wszystkich powłokach jako argument printf; inne konteksty i notacje są zależne od powłoki.

Screen nie rozpoznaje żadnej z tych sekwencji ucieczki, ale rozpoznaje ^jako prefiks kontrolny, więc ^[oznacza znak 27.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.