Nhập dòng lệnh trong khi tập lệnh đang chạy hiển thị các ký hiệu lạ


8

Nếu tôi sử dụng bash shell cli và chạy một số chương trình không trả về ngay lập tức, thì tôi nhập một số chữ cái (về cơ bản là gõ lệnh tiếp theo trước khi nhận thấy trước đó không kết thúc) và đầu vào luôn trông giống như thế này (đặc biệt là khi sử dụng mũi tên lên và xuống :)

]]A^ or ]]B^

Và tôi tự hỏi, liệu loại đầu vào quá sớm này có "có hại" hay không, hoặc chuỗi trả về có nghĩa là gì?


1
Điều này không cụ thể đối với bash, tôi sẽ xóa thẻ đó.
Didi Kohen

Câu trả lời:


8

Các chuỗi này là đại diện thô của các ký tự đặc biệt bạn đã nhập (như nhà, kết thúc, mũi tên, tab, v.v.).
Tác động có hại của chúng được kiểm soát bởi lệnh bạn đang chạy, nếu nó đang nhận đầu vào từ thiết bị đầu cuối, các ký tự này sẽ là một phần của đầu vào.
Nếu nó không nhận đầu vào từ thiết bị đầu cuối, nó sẽ không có bất kỳ tác động bất lợi nào đối với bất kỳ hương vị Unix nào tôi biết.


13

Một số phím trên bàn phím của bạn không tương ứng với các ký tự thực tế. Ví dụ, Atương ứng với ký tự anhưng phím UpF1phím không có ký tự chuyên dụng riêng. Khi nhấn các phím đặc biệt đó, thay vì nhận một ký tự đơn tương ứng với phím, thiết bị đầu cuối sẽ dịch phím nhấn thành một chuỗi đặc biệt gồm nhiều ký tự thường bắt đầu bằng ký tự thoát (thường được hiển thị là ^[). Ví dụ: Upthường tạo chuỗi ^[[A(đó là 3 ký tự từ một khóa: thoát [A).

Lý do bạn thường không thấy ^[[Alà vì hầu hết các ứng dụng bảng điều khiển đủ thông minh để dịch các chuỗi đặc biệt thành các lệnh hữu ích thay vì chỉ lặp lại nó vào bàn điều khiển. Để làm điều này, họ tắt tiếng vang tích hợp của thiết bị đầu cuối và xử lý mức thấp hơn của riêng họ. Ví dụ, khi bashnhìn thấy ^[[A, nó nhận ra điều đó có nghĩa là bạn đã nhấn Upvà thay vì lặp ^[[Alại, nó thực hiện cả đống thứ để xóa bất cứ thứ gì bạn đã gõ cho đến nay, lấy lệnh trước đó được lưu trong lịch sử và thay vào đó in ra.

Nếu bạn thấy ^[[Akhi bạn nhấn Up, điều đó thường có nghĩa là tiếng vang của thiết bị đầu cuối được bật và quá trình tiền cảnh (điều khiển trong thiết bị đầu cuối) không thực hiện bất kỳ xử lý đặc biệt nào được đề cập ở trên. Điều này có thể là do ứng dụng đơn giản bỏ qua thiết bị đầu cuối (giống như hầu hết các lệnh không tương tác). Lưu ý rằng thông thường, trình bao đặt thiết bị đầu cuối vào chế độ chính tắc và bật tiếng vang trước khi chạy quy trình nền trước và khôi phục cài đặt của chính nó sau khi lấy lại quyền kiểm soát thiết bị đầu cuối sau khi lệnh thoát.

Tiếng vang có vẻ khá vô hại. Chỉ cần nhớ rằng nếu lệnh đang chạy không đọc từ thiết bị đầu cuối, các ký tự bạn tạo qua bàn phím có thể sẽ kết thúc trong bashhàng đợi đầu vào, vì vậy hãy cẩn thận những gì bạn nhập vì chúng có thể được hiểu là các lệnh thông thường khi bashđọc lại từ thiết bị đầu cuối.

Đây thực sự là một sự đơn giản hóa. Do trình tự cụ thể có thể thay đổi theo loại thiết bị đầu cuối, nên thường có nhiều lớp thư viện trừu tượng ở giữa một ứng dụng bàn điều khiển và chính thiết bị đầu cuối. Ví dụ, bashsử dụng readlinethư viện để thực hiện hầu hết các đầu vào của nó.


1
Từ những gì tôi hiểu được từ câu hỏi, trường hợp ở đây là trong khi thực hiện một lệnh khác và không phải trong thời gian bạc giữa quá trình thoát và trước khi bash khôi phục cài đặt đầu cuối. Mặc dù vậy, tôi đã đưa ra câu trả lời của bạn, vì nó giải thích chi tiết về trường hợp này, không giống như câu trả lời của tôi là mức tối thiểu cần thiết để trả lời.
Didi Kohen

@DavidKohen Tôi nghĩ bạn đúng về câu hỏi ban đầu. Tôi đã điều chỉnh câu trả lời của mình một chút để tính đến khi lệnh vẫn đang chạy.
jw013
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.