Simbol aneh di layar saat menggunakan grep?

12

./trans ... output perintah yang menunjukkan kode pelarian

Adakah yang tahu apa yang menyebabkan ini? Tanpa menggunakan grep, satu-satunya barang yang ditampilkan adalah kode ISO dan ruang kosong.

Perangkat lunak yang digunakan

Perintah: ./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'

Output normal:

output perintah trans dengan teks dan URL yang dapat dibaca

Freedo
sumber
Tolong tempelkan output alih-alih melampirkan gambar. Sehingga orang lain dapat menggunakan kembali perintah yang disisipkan untuk mereproduksi yang sama pada sistem mereka.
Thushi
9
@ Thushi Dalam hal ini tangkapan layar sesuai, karena mereka tidak akan dapat menempelkan simbol mesin terbang yang hilang di sini.
Sparhawk
Bisakah Anda mengedit di screenshot dari perintah yang dijalankan tanpa trailing greps, dan hasil dari alias grepdan type grep?
Michael Homer

Jawaban:

28

Tangkapan layar muncul untuk menunjukkan kode warna ANSI rusak , yang mengontrol rendering teks. Teks tebal / cerah dihasilkan dengan urutan ␛[1m, yang biasanya ditafsirkan oleh terminal Anda dan tidak ditampilkan di layar secara langsung: itu hanya membuat bit teks berikutnya cerah. Screenshot dari un grepped output menunjukkan bahwa perbedaan warna antara label dan nilai pada setiap baris, sehingga output asli menggunakannya.

Tampaknya urutan itu telah diputus oleh final Anda grep, yang cocok dengan "m" dalam kode (karena itu huruf [a-z]) dan mencoba menyorotnya dalam warna merah itu sendiri. Yang meninggalkan urutan pelarian sebagian di belakang, yang tidak bisa diproses terminal Anda.

Karakter melarikan diri adalah U + 001B, yang merupakan angka heksadesimal yang diberikan dalam kotak karakter yang tidak dikenal. Apa yang ditampilkan adalah jalan keluar (kotak), a [, a 1, merah mdiikuti oleh teks yang cocok "eng" yang diharapkan, dan yang sama terjadi di akhir dengan "22" (kode numerik untuk "warna normal & intensitas").


Output yang rusak benar-benar:

␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m 

di mana ␛[31mmembuat teks merah dan ␛[22mmengubahnya kembali menjadi putih, keduanya disisipkan di grepsekitar mkarakter ke dalam teks asli. Aslinya hanya:

 ␛ [1m eng ␛ [22m 

yang hanya " eng" cerah dan kemudian beralih kembali ke teks normal.

Anda bisa memeriksanya dengan mengubah final Anda grepmenjadi grep --color=alwaysdan menyalurkan ke hexdump, yang akan menunjukkan semua karakter yang tidak patut dicetak dan yang ditafsirkan oleh terminal Anda.


Anda bisa mengatasinya dengan beberapa cara. Pertama adalah menggunakan greptanpa alias Anda untuk saat ini:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

Backslash untuk sementara melompati alias dan berjalan grepsecara langsung.

Cara lain adalah menghapus kode ANSI dari perintah asli, yang ada beberapa saran dalam pertanyaan ini :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

Namun pilihan lain adalah menambahkan pipa asing di akhir:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

Karena hasil akhir greptidak langsung ke TTY, tetapi catmelalui pipa, itu tidak akan memasukkan highlight berwarna.

Mungkin opsi terbaik adalah untuk mendapatkan Translate Shell untuk berhenti menggunakan urutan kontrol terminal di output sendiri di tempat pertama ketika tidak ke terminal. Itu akan melibatkan laporan bug dari Anda kepada pembuatnya dan perbaikan kode ke ansi()fungsi Shell , tetapi orang dapat melakukannya dengan sedikit:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

Ini melewati dumbjenis terminal di lingkungan Translate Shell, yang setidaknya diakui tidak memiliki dukungan warna ECMA-48. (Sedihnya, Translate Shell tidak menggunakan terminfo, dan hanya perangkat keras dalam kode sendiri jenis terminal yang dipahami dan urutan kontrol yang digunakannya.)

Michael Homer
sumber
wow, saya tidak akan pernah bisa men-debug ini sendiri dan tanpa tempat seperti ini, jadi terima kasih!
Freedo
IMO pelakunya bisa dengan mudah menjadi variabel rusak GREP_COLORatau GREP_COLORSlingkungan yang berisi urutan melarikan diri SGR lengkap, bukan hanya angka.
egmont
Wow, banyak sekali solusinya. Anda juga dapat menambahkan --color=nogrep terakhir (atau menerapkannya TERM=dumb)
Ángel