Có bất kỳ lý do tại sao tôi nhận được ^ [[A khi tôi nhấn mũi tên lên trên màn hình đăng nhập bảng điều khiển?


32

Bất cứ khi nào tôi đăng nhập bảng điều khiển, tôi upcố tình nhấn mũi tên để xem các lệnh đã nhập trước đó. Nhưng tôi thấy điều này ^[[A.

Nhưng khi tôi nhấn Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winphím không lặp lại bất kỳ ký tự nào.

Điều gì có thể là lý do đằng sau?

Liệu các ^[[Aloại nhân vật ngụ ý bất cứ điều gì?

nhập mô tả hình ảnh ở đây

Câu trả lời:


20

Đó là cách mà thiết bị đầu cuối đại diện cho mã khóa thô của phím Up được gửi tới bàn phím. Về cơ bản, shell của bạn thường sẽ chặn phím bấm, nhưng không có gì để làm điều đó tại dấu nhắc đăng nhập. Vì vậy, ký tự mà bạn đã nhập được in ra bàn điều khiển giống như bất kỳ chữ cái nào khác (hoặc số hoặc bất cứ thứ gì).


3
@RubanSavvy Ctrl, Alt và Win (thường được gọi là Super trong thế giới GNU / Linux) là các sửa đổi. Nếu bạn nhấn chúng và một phím, bạn sẽ thấy một cái gì đó khác được in trên màn hình. Khóa cuộn tôi nghi ngờ được giải thích bởi kernel hoặc thứ gì đó ở mức độ thấp, để kiểm soát tty, mặc dù tôi không chắc chắn. Trang lên và xuống có lẽ bị nuốt bởi gettyhoặc login, mặc dù tôi không chắc tại sao. Đoán có giáo dục nói rằng màn hình in được giải thích đặc biệt bởi hạt nhân vì lý do lịch sử. Mặc dù vậy, tôi không chắc chắn 100% về bất kỳ công cụ sửa đổi nào.
strugee

3
ở trên có lẽ nên được chỉnh sửa thành câu trả lời.
strugee

thảo luận liên quan trong trò chuyện: chat.stackexchange.com/transcript/message/12481097#12481097
strugee

19

Bàn phím gửi sự kiện đến máy tính. Một sự kiện cho biết mã quét quét nnn xuống mã hoặc quét mã nnn lên mã. Ở đầu kia của chuỗi, các ứng dụng đang chạy trong một thiết bị đầu cuối mong đợi đầu vào ở dạng một chuỗi các ký tự. (Trừ khi họ đã yêu cầu quyền truy cập thô, giống như máy chủ X.) Khi bạn nhấn A, bàn phím sẽ gửi thông tin mã quét 38 xuống xuống. Trình điều khiển giao diện điều khiển tra cứu sơ đồ bàn phím của nó và biến nó thành ký tự của LĐNH a(nếu không nhấn phím bổ trợ).

Khi bạn nhấn phím hoặc tổ hợp phím không dẫn đến ký tự, thông tin cần được mã hóa theo các ký tự. Một vài khóa và tổ hợp phím có các ký tự điều khiển tương ứng, ví dụ Ctrl+ Agửi ký tự (giá trị byte 1), Returngửi ký tự (Ctrl + M, giá trị byte 13), v.v. Hầu hết các phím chức năng không có ký tự tương ứng và thay vào đó gửi một chuỗi các ký tự bắt đầu bằng (thoát, giá trị byte 27). Ví dụ, khóa Upđược dịch thành chuỗi thoát ␛[A(ba ký tự: thoát, dấu ngoặc mở, viết hoa A).

Dấu nhắc tên người dùng trên bảng điều khiển bị câm và không hiểu hầu hết các chuỗi thoát. Nó không có phiên bản dòng và các tính năng lịch sử mà bạn đã từng sử dụng: những tính năng được cung cấp bởi trình bao và cho đến khi bạn đăng nhập, bạn không có trình bao. Vì vậy, nó chỉ đơn giản là hiển thị trình tự thoát. Không có glyph cho nhân vật, vì vậy nó được hiển thị dưới dạng ^[. Các^ dấu hiệu được sử dụng như một tiền tố cho các ký tự điều khiển, và thoát là ^[vì giá trị byte của nó: đó là giá trị byte [, trừ đi 64.

Nếu bạn nhấn Uptại dấu nhắc shell, điều này sẽ gửi chuỗi 3 ký tự tương tự đến trình bao của bạn. Shell diễn giải điều này như một chuỗi lệnh (thường để gọi lại mục lịch sử trước đó). Nếu bạn nhấn Ctrl+ Vthì Uptại dấu nhắc shell, thao tác này sẽ chèn chuỗi thoát tại dấu nhắc:Ctrl + Vlà lệnh chèn ký tự tiếp theo theo nghĩa đen thay vì diễn giải nó dưới dạng lệnh, do đó, ký tự không được hiểu là bắt đầu của chuỗi thoát .

Một số khóa chỉ là sửa đổi và không được truyền đến các ứng dụng đầu cuối. Ví dụ: khi bạn nhấn Shift, thông tin này sẽ nằm trong trình điều khiển thiết bị đầu cuối và được tính đến nếu bạn nhấn A, sau đó trình điều khiển sẽ gửi Ađến ứng dụng thay vì a.

Ngoài ra, một số phím chức năng có thể không được ánh xạ trong bảng điều khiển của bạn.

Để có chế độ xem tương tự trong GUI, hãy xem Khóa meta của bash là gì?


Đây là một câu trả lời tuyệt vời, cảm ơn Gilles như mọi khi.
JoshuaRLi

5

Đây không phải là về cách các phím được biểu thị bằng "thiết bị đầu cuối" (nghĩa là ứng dụng giả lập thiết bị đầu cuối). Những gì bạn đang thấy là mã ANSI ( chuỗi thoát ANSI ) để di chuyển lên trên một dòng, nhưng được dịch sang dạng có thể in được.

  1. Phần cứng bàn phím gửi "mã quét", nhưng chúng được dịch và trình bày cho các ứng dụng cấp dòng lệnh dưới dạng ký tự. Khóa Atrở thành một byte đơn: Anếu phím Shift bị tắt (hoặc Shift Lock),a nếu không.

  2. Trong thiết bị đầu cuối tuân thủ ANSI, các phím mũi tên không gửi một ký tự (không có mã cho các mũi tên trong bộ ký tự ASCII), nhưng "chuỗi thoát" gồm 3 ký tự : escape-[-A. Ba phím mũi tên khác là escape-[-B, C, D.

  3. Chuỗi ký tự tương tự sẽ di chuyển con trỏ lên một dòng nếu được gửi (echo'ed) đến một thiết bị đầu cuối ANSI vật lý cũ. Nhiều chương trình, bao gồm các trình giả lập thiết bị đầu cuối, nhận ra các chuỗi ký tự này và làm một cái gì đó phù hợp: trình giả lập thiết bị đầu cuối sẽ di chuyển con trỏ lên (đây là cách cursesthư viện di chuyển con trỏ xung quanh), nhưng bashsẽ chặn nó và cuộn lịch sử thay thế.

  4. Để tránh việc con trỏ kết thúc ở mọi nơi trong các chương trình không sử dụng để di chuyển con trỏ quanh màn hình, bạn sẽ thường thấy ESC trong đầu vào bàn phím được hiển thị dưới dạng chuỗi có thể in ^[(vì thoát tương ứng với control-[). Điều này thực sự được xử lý bởi giao diện thiết bị đầu cuối; thấy stty(1). Kết quả là, mũi tên lên sẽ hiển thị như ^[[A. Bạn sẽ thấy điều này từ dòng lệnh nếu bạn gõ cat, nhấn return và nhấn một số phím mũi tên. Đây cũng là những gì bạn thấy trên màn hình đăng nhập giao diện điều khiển.

Cuối cùng : Control, Altvà các phím khác mà bạn đề cập không ánh xạ tới chuỗi ký tự. Chúng ảnh hưởng đến ký tự được gửi bởi một phím bấm khác (như a/ Aví dụ ở trên) hoặc đơn giản là chúng không có ánh xạ tới văn bản. Các phím nhấn như vậy chỉ có thể được phát hiện bởi các chương trình nghe các sự kiện bàn phím. Chúng không thể được nhìn thấy bằng cách đọc từ đầu vào tiêu chuẩn (hoặc được ghi vào một tệp).


3

Hành vi này là khác nhau từ vỏ đến vỏ. Hầu hết các shell sử dụng một thư viện được gọi readlineđể chỉnh sửa các dòng trong dấu nhắc. Dưới đây là một tài liệu tham khảo lệnh đầy đủ cho thư viện này, vì vậy khi một ứng dụng đang sử dụngreadline bạn có thể chỉnh sửa và điều hướng các dòng bằng các lệnh này.

Các phím mũi tên dọc được cấu hình trong đường dẫn để điều hướng lịch sử lệnh. Và trong promt đăng nhập không có lịch sử lệnh. Đó là lý do tại sao các ký tự ^[[A^[[Bđược in trên màn hình. Vậy làm gì^[[A nghĩa là gì?

Trang hướng dẫn của bash nói dưới PROMPTINGđây:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Các trình tự thoát cho các phím mũi tên trong ANSI là:

  • [ValueACon trỏ lên (nơi Valuecó thể là emtpy)

  • [ValueBCon trỏ xuống (nơi Valuecó thể là emtpy)


5
Câu trả lời của bạn là về điều khác nhau, bởi vì lời nhắc đăng nhập được in và xử lý bởi login, không liên quan đến bash.
Risto Salminen

1
bashloginđang sử dụng cùng một thư viện (readline) để chỉnh sửa các dòng. Sự khác biệt chỉ là loginkhông diễn giải các phím mũi tên dọc như một lệnh, giống như bashvậy.
hỗn loạn

Vâng, tôi thừa nhận rằng.
Risto Salminen

Cú pháp bash có nghĩa là trông giống như ^[đại diện escape, nhưng chúng là những thứ khác nhau. Bash có thể đã sử dụng bất kỳ cú pháp nào cả. Trong thực tế, khi bạn viết \[A, bash xuất ra ba ký tự: ^[(nghĩa là thoát) [, A.
alexis

0

Đó là những mã thoát ANSI . ^[là ký hiệu mà shell của bạn sử dụng để hiển thị một ESCbyte (ASCII byte 27). Vì vậy, ví dụ của bạn là một byte ESC theo sau là văn bản [A. Như bạn có thể thấy trong bài viết Wikipedia, ^[[( ESCtiếp theo [) là Trình giới thiệu trình tự điều khiển hoặc CSI. CSI Acó nghĩa là di chuyển con trỏ lên bằng một cột.

Nếu bạn muốn xem mã thoát trong thiết bị đầu cuối, hãy nhập CTRL + V và sau đó là một chuỗi khóa khác. Ví dụ: CTRL + V theo sau là mũi tên lên hiển thị ^[[A.


0

Shell lệnh, ví dụ Bash là chương trình dịch mũi tên lên thành hành động "lấy lại lệnh trước". Bạn không có một shell lệnh đang chạy.


0

TLD

Bạn có thể đang chạy shđể tạo ra các mã khóa thô được tạo khi bạn nhấn phím mũi tên Lên.

Một shell tiên tiến hơn như bashchặn các mã khóa này và làm một cái gì đó với chúng. Ví dụ: hiển thị lệnh cuối cùng trong lịch sử của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.