Kiểu trình tự nào là trình tự thoát bắt đầu bằng Hồi \ 033]


18

Tôi đã tìm thấy nhiều chuỗi thoát trong Bash bắt đầu bằng \033], nhưng những chuỗi này là gì và tại sao chúng bắt đầu với \033]?

Câu trả lời:


25

Chuỗi thực sự \033[và đó không phải là toàn bộ.

Sau đó, khung mở đầu xuất hiện một loạt các số và ký hiệu. Chuỗi này được gọi là một chuỗi thoát và được sử dụng để kiểm soát con trỏ và màu văn bản của giao diện điều khiển, trong số những thứ khác.

trình tự thoát không in phải được đính kèm trong \[\033[ and \]

Nếu chuỗi thoát đang kiểm soát màu văn bản, thì nó sẽ được theo sau bởi một m.

Đây là bảng cho các chuỗi màu:

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   

Vì vậy, nếu bạn muốn dấu nhắc giao diện điều khiển của mình có màu xanh, bạn sẽ sử dụng chuỗi thoát sau đây (trong tên tệp tôi đang quên):

\[\033[34m\]

(Lưu ý m)

Trình tự thoát này không chỉ kiểm soát màu sắc, tuy nhiên. Nó cũng có thể điều khiển chuyển động con trỏ. Dưới đây là bảng / danh sách với mã chuyển động và cách chúng hoạt động:

  • Định vị con trỏ:

    \033[<L>;<C>H

    Hoặc là

    \033[<L>;<C>f

    đặt con trỏ ở dòng L và cột C.

  • Di chuyển con trỏ lên N dòng:

    \033[<N>A
  • Di chuyển con trỏ xuống N dòng:

    \033[<N>B
  • Di chuyển con trỏ về phía trước N cột:

    \033[<N>C
  • Di chuyển con trỏ N cột ngược:

    \033[<N>D
  • Xóa màn hình, di chuyển đến (0,0):

    \033[2J
  • Xóa đến cuối dòng:

    \033[K
  • Lưu vị trí con trỏ:

    \033[s
  • Khôi phục vị trí con trỏ:

    \033[u

Chỉ cần lưu ý rằng hai cái cuối cùng có thể không hoạt động trong trình giả lập thiết bị đầu cuối mà bạn sử dụng. Rõ ràng, chỉ xtermnxtermsử dụng hai chuỗi đó.

Và ví dụ sử dụng một trong các chuỗi thoát này: giả sử tôi muốn định vị con trỏ của mình ở dòng 3, cột (ký tự) 9. Vì vậy, tôi sẽ sử dụng

\[033\[3;9H]

(Tôi giả sử rằng cột 0 là vị trí đầu tiên, vì vậy đó sẽ là ký tự thứ 8).

Nguồn: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (cũng đọc 6.2)

Đọc tổng quát hơn: http://ascii-table.com/ansi-escape- resultences.php

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


2
cũng xem xét liên kết đến en.wikipedia.org/wiki/ANSI_escape_code
mèo

2
Lưu ý rằng '\ 033' là ký tự ESCAPE theo số bát phân, do đó, nó có thể được đưa ra dưới dạng thập phân (27) hoặc hex (0x1B). Có nhiều cách viết ESCAPE phổ biến khác, ví dụ '^ [' trong các tập lệnh shell, "\ e" trong bindkey, v.v.
jamesqf

1
Xin lưu ý rằng một số mục trong bảng đó là sai lệch hoặc không chính xác: đậm, mờ, gạch chân, v.v. có thể được đặt và đặt lại độc lập với màu sắc, và cũng được đặt lại bằng 0 cùng với các màu; có một bộ mã hoàn toàn riêng biệt (40 mộc49) cho nền và 7 thay vào đó hoán đổi nền trước và nền; ESC [2Kxóa toàn bộ dòng cả trước và sau con trỏ. Một nguồn tốt hơn nhiều sẽ là bài viết Wikipedia hoặc bạn có thể truy cập trực tiếp vào ECMA-48 , phần 8.3.117 SGR - Chọn Kết xuất đồ họa .
deltab

Cụm từ "ký tự" ở cuối mỗi câu sau đây được sử dụng làm ký tự dừng " trên bài đăng của cplusplus.com cũng hơi khó hiểu, vì bảng bên dưới chứa các lệnh rõ ràng không bị chấm dứt bởi một "m". Trên thực tế có vẻ như thậm chí còn sai lệch hơn ở đây khi được trình bày ở trên cùng.
ilkkachu

1
Về mặt kỹ thuật, việc dẫn đầu 0;trong các chuỗi màu là không cần thiết. Điều đó chỉ làm cho màu nền mặc định trước khi đặt nền trước. Bạn cũng có thể thiết lập nền với 4x.
Vụ kiện của Quỹ Monica

17

Chúng là các lệnh điều khiển cho thiết bị đầu cuối.

Thiết bị đầu cuối ban đầu là các thiết bị khá ngu ngốc được kết nối với một cổng nối tiếp và không phải là những phần mềm GUI đa tab ưa thích với các menu mà chúng ta hiện có. Vì chúng chỉ nhận được một luồng ký tự (byte), nên không có sự phân tách rõ ràng giữa dữ liệu (những gì cần in trên màn hình) và các lệnh (cách in nó). Thay vào đó, các lệnh được thể hiện bằng các ký tự điều khiển đặc biệt.

Các ký tự điều khiển rõ ràng là những thứ như nguồn cấp dữ liệu (dòng mới), backspace và tiếng bíp chuông, nhưng các lệnh cụ thể hơn được đưa ra dưới dạng các chuỗi ký tự, bắt đầu bằng ESCký tự (mã 27 ở dạng thập phân, 0x1b trong hex hoặc 033 bát phân). Nó thường được đại diện như ^[, hoặc \033như trong ví dụ của bạn.

Chuỗi ESC [được gọi là CSI hoặc Trình giới thiệu trình tự điều khiển và nó bắt đầu một lệnh với các tham số số tùy chọn, kết thúc bằng một chữ cái xác định lệnh chính. Hầu hết các chuỗi thoát phổ biến rơi vào lớp này.

Danh sách mã thoát có thể được tìm thấy, ví dụ như trong console_codes(4)trang man và trên trang Wikipedia cho mã thoát ANSI .

Vài ví dụ:

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

Bạn có thể kiểm tra các lệnh với ví dụ Bash. Sử dụng -ecờ, echolệnh dựng sẵn chấp nhận \033làm đại diện cho ESCký tự.

Ví dụ, điều này sẽ in một lời chào có màu ở giữa màn hình và một lời chào bình thường khác ở vị trí con trỏ ban đầu:

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

Trình tự ESC ]mà bạn đã đề cập là OSC hoặc Lệnh hệ điều hành, phần lớn được sử dụng trong lệnh để đặt tiêu đề cửa sổ xtermvà các mục khác, ví dụ:

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

Sau đó, cũng có ESC ( A(và các chữ cái khác) đặt các ký tự quốc gia trên một số thiết bị đầu cuối, thành một hiệu ứng vui nhộn tiềm năng .


8

Thoát theo sau là một dấu ngoặc vuông bên phải escape]được sử dụng để giới thiệu lệnh hệ điều hành ( OSC).

Nó nằm trong ECMA-48 và bạn có thể đọc một bản tóm tắt các chuỗi điều khiển được sử dụng bởi xterm trong Trình tự điều khiển XTerm , ví dụ, để thay đổi tiêu đề của cửa sổ đầu cuối.

Trình tự thoát có thể bắt đầu với các nhân vật khác nhau. Các C1 (8-Bit) Kiểm soát Nhân vật phần trong XTerm kiểm soát Sequences đề cập đến một vài trong số những: CSI(mà bạn thấy như escape[, APC, DCS, PM. Lý do cho sự (thứ hai) nhân vật khác nhau là do cặp (thoát và ]) được liên kết với một ký tự điều khiển byte đơn được sử dụng cho các loại chuỗi thoát khác nhau .

Nếu bạn đọc qua đặc tả, bạn sẽ thấy rằng CSIđược sử dụng cho các điều khiển với tham số số, trong khi OSCcho phép chuỗi. Ngoài cú pháp, ủy ban tạo ra tiêu chuẩn này có ý định sử dụng APCPMkhác với DCSOSC.


7

Chúng được gọi là mã thoát ANSI và chúng được liệt kê trong trang man cho console_codes . Chúng không phải là đặc trưng của Bash, mà là hoạt động trong bất kỳ ứng dụng giao diện điều khiển nào miễn là thiết bị đầu cuối hỗ trợ chúng (hầu hết các trình giả lập thiết bị đầu cuối đều làm như vậy).


1

"Trình tự thoát" được mô tả trong các câu trả lời khác phụ thuộc vào loại TYPE đầu cuối nào của bạn (thường là "ANSI" hoặc dẫn xuất / tương tự).

$ echo $TERM  
xterm

Nếu bạn muốn viết các tập lệnh (phần nào) ĐỘC LẬP của thuật ngữ, nhưng vẫn sử dụng ví dụ như màu sắc và các tính năng đặc biệt khác, thì hãy xem nội dung của man terminfo.

ví dụ

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

sẽ in .test.với testnền màu vàng và màu nền trước màu đỏ, và điều này sẽ hoạt động cho BẤT K terminal thiết bị đầu cuối nào thực sự có khả năng sử dụng màu theo cách tương tự.

Để xem những gì thực sự được in, hãy đưa nó vào od -t x1znhư trong

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

... Trong đó các giá trị được hiển thị dưới dạng thập lục phân (do "x").

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.