Ảnh chụp màn hình xuất hiện để hiển thị mã màu ANSI được điều khiển, điều khiển kết xuất văn bản. Chữ in đậm / sáng được tạo ra theo trình tự ␛[1m
, thường được hiểu bởi thiết bị đầu cuối của bạn và không được hiển thị trực tiếp trên màn hình: nó chỉ làm cho đoạn văn bản tiếp theo sáng lên. Ảnh chụp màn hình của grep
đầu ra un ped cho thấy sự khác biệt màu sắc giữa các nhãn và giá trị trên mỗi dòng, vì vậy đầu ra ban đầu đang sử dụng chúng.
Dường như chuỗi đó đã bị phá vỡ bởi trận chung kết của bạn grep
, khớp với "m" trong mã (vì đó là một chữ cái [a-z]
) và cố gắng làm nổi bật nó bằng màu đỏ. Điều đó đã để lại một chuỗi thoát một phần phía sau, mà thiết bị đầu cuối của bạn không thể xử lý.
Ký tự thoát ␛
là U + 001B, là số thập lục phân được hiển thị trong các hộp ký tự không xác định. Những gì hiển thị là lối thoát (hộp), a [
, a 1
, màu đỏ m
theo sau là văn bản phù hợp dự kiến "eng" và tương tự xảy ra ở cuối với "22" (mã số cho "màu sắc & cường độ bình thường").
Đầu ra bị hỏng thực sự là:
␛ [1 ␛ [31m meng ␛ [22m [22 ␛ [31m m ␛ [22m
trong đó ␛[31m
làm cho văn bản màu đỏ và ␛[22m
biến nó trở lại màu trắng, cả hai được chèn bởi grep
các m
ký tự xung quanh thành văn bản gốc. Bản gốc chỉ là:
␛ [1m eng ␛ [22m
chỉ sáng " eng
" và sau đó chuyển trở lại văn bản bình thường.
Bạn có thể kiểm tra điều này bằng cách thay đổi cuối cùng của bạn grep
vào grep --color=always
và chuyển sang hexdump
, sẽ hiển thị tất cả các ký tự không thể in được và các ký tự được giải thích bởi thiết bị đầu cuối của bạn.
Bạn có thể đối phó với điều này một vài cách. Một là sử dụng grep
mà không có bí danh của bạn tại thời điểm này:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
Dấu gạch chéo ngược tạm thời bỏ qua bí danh và chạy grep
trực tiếp.
Một cách khác là loại bỏ mã ANSI khỏi lệnh ban đầu, trong đó có một số gợi ý trong câu hỏi này :
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
Tuy nhiên, một lựa chọn khác là thêm một ống ngoại lai vào cuối:
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
Bởi vì đầu ra cuối cùng grep
không trực tiếp đến TTY, nhưng cat
thông qua một đường ống, nó sẽ không chèn phần tô sáng màu.
Có lẽ tùy chọn tốt nhất là khiến cho Shell Shell ngừng sử dụng các chuỗi điều khiển đầu cuối ở đầu ra của chính nó ở vị trí đầu tiên khi nó không đến một thiết bị đầu cuối. Điều đó sẽ liên quan đến một báo cáo lỗi từ bạn đến (các) tác giả của nó và sửa lỗi mã cho ansi()
chức năng của Dịch Shell , nhưng người ta có thể khắc phục nó phần nào:
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
Điều này vượt qua dumb
loại thiết bị đầu cuối trong môi trường của Translate Shell, mà ít nhất nó nhận ra là không có hỗ trợ màu ECMA-48. (Đáng buồn thay, Translate Shell không sử dụng terminfo và chỉ sử dụng mã cứng trong các loại mã riêng mà nó hiểu và các chuỗi điều khiển mà nó sử dụng.)