Biểu tượng lạ trên màn hình khi sử dụng grep?


12

./trans ... đầu ra lệnh hiển thị mã thoát

Bất cứ ý tưởng những gì có thể gây ra điều này? Không sử dụng grep, công cụ duy nhất hiển thị có mã ISO và không gian trống.

Phần mềm được sử dụng

Chỉ huy: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

Đầu ra bình thường:

đầu ra lệnh trans với văn bản và URL có thể đọc được


Vui lòng dán đầu ra thay vì đính kèm hình ảnh. Để những người khác có thể sử dụng lại lệnh đã dán để sao chép giống nhau trên hệ thống của họ.
Do đó,

9
@Thushi Trong trường hợp này, ảnh chụp màn hình là phù hợp, vì họ sẽ không thể dán các biểu tượng glyph bị thiếu ở đây.
Sparhawk

Bạn có thể chỉnh sửa trong ảnh chụp màn hình của lệnh chạy mà không có dấu vết grepvà kết quả của alias greptype grepkhông?
Michael Homer

Câu trả lời:


28

Ả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 đỏ mtheo 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 đó ␛[31mlàm cho văn bản màu đỏ và ␛[22mbiến nó trở lại màu trắng, cả hai được chèn bởi grepcác mký 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 grepvào grep --color=alwaysvà 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 grepmà 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 greptrự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 grepkhông trực tiếp đến TTY, nhưng catthô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 dumbloạ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.)


wow, tôi sẽ không bao giờ có thể tự sửa lỗi này và không có một nơi như thế này, vì vậy cảm ơn bạn!
Freedo

IMO thủ phạm có thể dễ dàng là một biến môi trường GREP_COLORhoặc GREP_COLORSbiến có chứa các chuỗi thoát SGR hoàn chỉnh, thay vì chỉ là các con số.
egmont

Wow, rất nhiều giải pháp. Bạn cũng có thể thêm --color=novào grep cuối cùng (hoặc áp dụng TERM=dumbnó)
Ángel
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.