Cara mencetak kesalahan standar merah

14

Bagaimana saya bisa mencetak kesalahan standar merah ke dalam konsol daripada menggunakan warna yang sama dari output standar?

Apakah mungkin menggunakan Terminal Gnome ?

Aslan986
sumber
Tautan ini mungkin membantu Anda
devav2
Anda dapat mengaktifkan perilaku ini untuk satu perintah dengan menggunakan satu hiliteutilitas . Anda harus secara manual menambahkan dulu hiliteke perintah shell Anda untuk menggunakannya, tetapi itu tetap berguna jika Anda tahu atau mencurigai bahwa suatu perintah menghasilkan kesalahan dan Anda ingin menemukannya.
Rory O'Kane

Jawaban:

8

Saya menggunakan stderred dan telah menemukan solusi yang baik. Sebagai catatan readme nya :

Stderred hooks pada write () dan keluarga fungsi stream (fwrite, fprintf, error ...) dari libc untuk mewarnai semua output stderr yang masuk ke terminal sehingga membuatnya dapat dibedakan dari stdout. Pada dasarnya itu membungkus teks yang masuk ke file dengan deskriptor "2" dengan kode melarikan diri ANSI yang tepat membuat teks merah.

Ini diimplementasikan sebagai pustaka bersama dan tidak memerlukan kompilasi ulang dari binari yang ada berkat fitur preload / insert dari dynamic linker.

Ini didukung di Linux (dengan LD_PRELOAD), FreeBSD (juga LD_PRELOAD) dan OSX (dengan DYLD_INSERT_LIBRARY).

Mudah untuk dikompilasi, tetapi Anda harus membuatnya dari sumber dengan mengikuti instruksi dari situs Github-nya :

sudo apt-get install build-essential git cmake 

Kemudian

git clone git://github.com/sickill/stderred.git
cd stderred

Kemudian

make

Bagian terpenting dari itu adalah menambahkan baris yang sesuai untuk Anda .bashrc; Anda harus menautkan ke libstderred.sofile di direktori build; Anda harus menggunakan path absolut tempat direktori build berada (/ home / mike / src / stderred / build). Saya menambahkan yang berikut ini ke .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Jelas, ketika Anda tidak ingin menggunakannya lagi, hapus baris di atas dari Anda .bashrcdan restart terminal.

Hasilnya, diuji pada file yang tidak ada (itu jelas tidak akan berfungsi ketika sudodigunakan, karena pengguna .bashrctidak akan dibaca ketika lingkungan yang berbeda diatur):

(Dengan cara itu tidak berubah duke saya @ Nukem merah prompt seperti yang merah sudah )

masukkan deskripsi gambar di sini


sumber
Tidak percaya saya pergi bertahun-tahun tanpa mengetahui bahwa ini ada! Ini sangat berguna dan seharusnya menjadi bagian dari OS untuk, oh, seratus tahun atau lebih sekarang. :)
Roger Dahl
6

Secara umum ya, karena Terminal Gnome adalah terminal ANSI dan mendukung kode pelarian ANSI standar.

Berikut ini sebuah contoh. Ketikkan ini di terminal Anda:

echo -e "\e[01;31mREDRUM\e[0m"

The -epilihan memungkinkan untuk menafsirkan kode backslash, sehingga \emenjadi "Esc" (kode hex 0x1b). Atau, untuk masuk melarikan diri secara langsung, tekan ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape dan [keduanya membentuk kode yang dikenali oleh terminal. Setelah urutan itu, Anda harus menyisipkan ;daftar atribut yang dipisahkan tanda titik dua ( ), diakhiri oleh m. Lihat di sini untuk semua kode. Contohnya termasuk atribut 0(setel ulang semua atribut, seperti yang mungkin Anda perhatikan di atas yaitu urutan yang mengakhiri contoh saya) dan banyak gaya (bergaris bawah, cerah, tebal dll.) Serta beberapa atribut warna.

Jawaban di atas memberi tahu Anda cara menggunakan warna saat Anda menulis program Anda sendiri.

Namun, jika saya memahami pertanyaan Anda dengan benar, Anda ingin memiliki pemisahan visual untuk stderr dan stdout dari setiap program yang Anda jalankan. Ini tidak mudah tanpa mem-parsing output mereka melalui filter. Berikut ini adalah contoh (ditemukan di sini ) bagaimana melakukannya:

  1. Tentukan fungsi (Anda bisa memasukkannya ke file .bashrc Anda):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Mulai program seperti ini:

    color program
    

Stderr dari program akan berwarna merah.

Januari
sumber
apakah ada cara untuk membuatnya mewarnai pesan yang salah dari program apa pun?
Luke