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:
grep
terminal
pipe
escape-characters
Freedo
sumber
sumber
grep
s, dan hasil darialias grep
dantype grep
?Jawaban:
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 ungrep
ped 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[
, a1
, merahm
diikuti 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:
di mana
␛[31m
membuat teks merah dan␛[22m
mengubahnya kembali menjadi putih, keduanya disisipkan digrep
sekitarm
karakter ke dalam teks asli. Aslinya hanya:yang hanya "
eng
" cerah dan kemudian beralih kembali ke teks normal.Anda bisa memeriksanya dengan mengubah final Anda
grep
menjadigrep --color=always
dan menyalurkan kehexdump
, yang akan menunjukkan semua karakter yang tidak patut dicetak dan yang ditafsirkan oleh terminal Anda.Anda bisa mengatasinya dengan beberapa cara. Pertama adalah menggunakan
grep
tanpa alias Anda untuk saat ini:Backslash untuk sementara melompati alias dan berjalan
grep
secara langsung.Cara lain adalah menghapus kode ANSI dari perintah asli, yang ada beberapa saran dalam pertanyaan ini :
Namun pilihan lain adalah menambahkan pipa asing di akhir:
Karena hasil akhir
grep
tidak langsung ke TTY, tetapicat
melalui 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:Ini melewati
dumb
jenis 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.)sumber
GREP_COLOR
atauGREP_COLORS
lingkungan yang berisi urutan melarikan diri SGR lengkap, bukan hanya angka.--color=no
grep terakhir (atau menerapkannyaTERM=dumb
)