Chuỗi bash '\ 033 [999D' nghĩa là gì và được giải thích ở đâu?


19

Tôi đã bắt gặp các chuỗi bash như \033[999D\033[2K\rđược sử dụng để thực hiện một số thao tác trên bản in trên thiết bị đầu cuối. Nhưng những chuỗi này có ý nghĩa gì? Tôi có thể tìm danh sách / tóm tắt trên web ở đâu để giúp tôi tìm hiểu ý nghĩa của các chuỗi này?


3
Đây là trình tự đầu cuối, không phải trình tự bash. Bạn cần xem tài liệu đầu cuối của bạn để xác định chức năng của chúng.
Chris Xuống

1
Những trình tự phục vụ để tô màu đầu ra. Kiểm tra: stackoverflow.com/questions/16845699/...stackoverflow.com/questions/5947742/...
adizere

1
@adizere không phải tất cả các chuỗi thoát thực hiện thay đổi màu sắc. Các trình tự trong Q này là dành cho thao tác dòng và di chuyển con trỏ, không phải màu sắc.
casey

Câu trả lời:


32

Xem liên kết này http://www.termsys.demon.co.uk/vtansi.htm . Như Anthon nói, \033 là mã bát phân kiểu C cho một ký tự thoát. Con [999Dtrỏ di chuyển trở lại 999 cột, có lẽ là một cách mạnh mẽ để bắt đầu dòng. [2Kxóa dòng hiện tại. \rlà một sự trở lại vận chuyển sẽ di chuyển con trỏ trở lại điểm bắt đầu của dòng hiện tại và là một chuỗi thoát kiểu C chứ không phải là một chuỗi điều khiển đầu cuối.

Cập nhật

Như những người khác đã chỉ ra, các chuỗi điều khiển này không có gì để làm bashmà chỉ là thiết bị đầu cuối / trình giả lập văn bản xuất hiện trên đó. Ngày xưa, thông thường các chuỗi này được giải thích bởi một phần cứng hoàn toàn khác. Ban đầu, mỗi người sẽ trả lời các bộ mã hoàn toàn khác nhau. Để giải quyết vấn đề này termcapterminfocác thư viện nơi được sử dụng để viết mã tương thích với nhiều thiết bị đầu cuối. Các tputlệnh là một giao diện cho terminfothư viện ( termcaphỗ trợ cũng có thể được biên dịch trong) và là một cách mạnh mẽ hơn để tạo ra chuỗi tương thích.

Điều đó nói rằng, cũng có tiêu chuẩn ANSI X3.64 hoặc ECMA-48 . Bất kỳ thiết bị đầu cuối hiện đại sẽ sử dụng này. terminfotermcapvẫn có liên quan vì việc triển khai có thể chưa hoàn thành hoặc bao gồm các phần mở rộng không chuẩn, tuy nhiên đối với hầu hết các mục đích, sẽ an toàn khi cho rằng các chuỗi ANSI thông thường sẽ hoạt động.

Câu xterm hỏi thường gặp cung cấp một số thông tin thú vị về sự khác biệt giữa các trình giả lập thiết bị đầu cuối hiện đại (nhiều người chỉ cố gắng xtermtự mô phỏng ) và cách xtermcác chuỗi liên quan đến các thiết bị đầu cuối VT100 được đề cập trong liên kết ở trên. Nó cũng cung cấp một danh sách chính xác các xtermchuỗi kiểm soát .

Tất nhiên cũng thường được sử dụng là bảng điều khiển Linux, một danh sách chính xác các chuỗi điều khiển cho nó có thể được tìm thấy man console_codescùng với việc so sánh với xterm.


Liên kết bạn đưa vào chỉ là trang tôi đang tìm kiếm.
Alex

@Alex Vui mừng tôi đã tìm thấy bản thân mình, hầu hết các trang tôi chỉ thấy màu sắc và bằng cách nào đó thực sự phức tạp để đọc. Điều này đặt nó ra tốt đẹp và đơn giản.
Graeme

hãy cẩn thận rằng hành động của mã thoát phụ thuộc vào loại thiết bị đầu cuối (và bạn có thể mô phỏng một số loại thiết bị đầu cuối trên màn hình / HĐH hiện đại). Bạn có thể sử dụng tputcác lệnh thay thế, để có tính di động cao hơn, iirc (nhưng với chi phí bảo hiểm ít hơn về các chi tiết cụ thể của thiết bị đầu cuối của bạn). VT100 (trang mà trang nói về) được nhiều người ủng hộ (nhưng không phải mọi thứ đều được hỗ trợ, tôi tin rằng ...). Nhưng biến TERM của bạn có thể được đặt thành một số thiết bị đầu cuối khác và điều này có thể ảnh hưởng đến tác động của một số lệnh
Olivier Dulac

@Olivier, đúng tputlà một cách mạnh mẽ hơn. Nhưng đó là khả năng tương thích ANSI chứ không phải là thiết bị đầu cuối VT100 cụ thể hiện khá phổ biến, mặc dù tôi tưởng tượng rằng có thể đặt ở xtermchế độ không chấp nhận chúng. Tôi sẽ cập nhật với một số thông tin thêm về điều này tôi nghĩ.
Graeme

@Olivier Rất nhiều trình giả lập thiết bị đầu cuối cũng được đặt TERM=xtermnhưng không thực hiện mọi thứ xterm.
Graeme

5

\033tự thoát là và các chuỗi đó không phải là bash cụ thể mà được giải thích bởi thiết bị đầu cuối (phần mềm hoặc phần cứng (qua mạng hoặc đường nối tiếp)) trong đó chương trình (bash) chạy. Có nhiều trình tự như vậy .

Mỗi cái làm gì, phụ thuộc vào thiết bị đầu cuối mà nó phụ thuộc và cũng có thể phụ thuộc vào bất kỳ chuỗi nào trước đó làm thay đổi trạng thái của thiết bị đầu cuối.

Chúng thường được sử dụng để đặt màu trong dấu nhắc bash , nhưng tôi không tìm thấy ví dụ cụ thể của bạn trên trang đó.


3

'\ 033 [999D' là buồn cười. Một số thiết bị đầu cuối thực hiện ít chuỗi thoát hơn, do đó, điều này có thể cần thiết nếu không có '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f' hoặc '\ r' hoạt động như chúng nên, nhưng ai sử dụng màn hình văn bản nghìn cột? Các chuỗi này có một trang man trong Linux: console_codes (4) . bjh21 có một danh sách chi tiết của tất cả các mã . Tùy thuộc vào chương trình phân tích cú pháp '\ 033' nào, sự thay thế rõ ràng hơn '\ e' có thể khả dụng.

Nó thực sự không có ý định sử dụng chúng trực tiếp - cách chính xác để ban hành các lệnh điều khiển đầu cuối là với một lớp trừu tượng như ncurses - nhưng chúng cũng hoạt động tốt từ các chuỗi ký tự.


Điểm hay, tôi chỉ cho rằng \033[999Dsẽ sao lưu so với (các) dòng trước. Chỉ có thể là kết quả của tinh ranh mã hóa mặc dù;) Bạn cũng có thể nhận được bashđể giải thích mã thoát trực tiếp, ví dụ như$'\033[999D'
Graeme

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.