GNU/Linux >> Belajar Linux >  >> Linux

Konfigurasikan Shell Untuk Mencetak Stderr Dan Stdout Dalam Berbagai Warna?

Saya ingin mengatur terminal saya jadi stderr dicetak dengan warna yang berbeda dari stdout; mungkin merah. Ini akan memudahkan untuk membedakan keduanya.

Apakah ada cara untuk mengonfigurasi ini di .bashrc ? Jika tidak, apakah ini mungkin?

Catatan :Pertanyaan ini digabungkan dengan pertanyaan lain yang menanyakan stderr , stdout dan gema masukan pengguna untuk menjadi output dalam 3 warna berbeda . Jawaban mungkin menjawab salah satu pertanyaan.

Jawaban yang Diterima:

Ini adalah versi yang lebih sulit dari Show only stderr on screen tetapi tulis stdout dan stderr ke file.

Aplikasi yang berjalan di terminal menggunakan satu saluran untuk berkomunikasi dengannya; aplikasi memiliki dua port keluaran, stdout dan stderr, tetapi keduanya terhubung ke saluran yang sama.

Anda dapat menghubungkan salah satunya ke saluran lain, menambahkan warna ke saluran itu, dan menggabungkan dua saluran, tetapi ini akan menyebabkan dua masalah:

  • Output gabungan mungkin tidak persis dalam urutan yang sama seperti jika tidak ada pengalihan. Ini karena pemrosesan tambahan pada salah satu saluran membutuhkan waktu (sedikit), sehingga saluran berwarna mungkin tertunda. Jika buffering dilakukan, gangguan akan semakin parah.
  • Terminal menggunakan urutan escape perubahan warna untuk menentukan warna tampilan, mis. ␛[31m berarti "beralih ke latar depan merah". Ini berarti bahwa jika beberapa keluaran yang ditujukan ke stdout tiba tepat saat beberapa keluaran untuk stderr sedang ditampilkan, keluaran akan berubah warna. (Lebih buruk lagi, jika ada sakelar saluran di tengah urutan pelarian, Anda akan melihat sampah.)

Pada prinsipnya, adalah mungkin untuk menulis sebuah program yang mendengarkan pada dua ptys, secara serempak (yaitu tidak akan menerima masukan pada satu saluran saat sedang memproses keluaran pada saluran lain), dan segera mengeluarkan keluaran ke terminal dengan instruksi perubahan warna yang sesuai. Anda akan kehilangan kemampuan untuk menjalankan program yang berinteraksi dengan terminal. Saya tidak tahu penerapan metode ini.

Pendekatan lain yang mungkin adalah menyebabkan program menampilkan urutan perubahan warna yang tepat, dengan mengaitkan semua fungsi libc yang memanggil fungsi write panggilan sistem di perpustakaan yang dimuat dengan LD_PRELOAD . Lihat jawaban sickill untuk implementasi yang ada, atau jawaban Stéphane Chazelas untuk pendekatan campuran yang memanfaatkan strace .

Dalam praktiknya, jika itu berlaku, saya sarankan mengarahkan stderr ke stdout dan menyalurkan ke pewarna berbasis pola seperti colortail atau multitail, atau pewarna tujuan khusus seperti colorgcc atau colormake.

Terkait:Bagaimana cara menghapus /volumes/ dari layanan automator menggunakan skrip shell yang ada?

terminal semu. Pipa tidak akan berfungsi karena buffering:sumber dapat menulis ke buffer, yang akan merusak sinkronisitas dengan pewarna.


Linux
  1. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  2. Apa Yang Dimaksud Dengan Menghubungkan Stdout Dan Stdin?

  3. Bagaimana Mengenalinya Jika Output Dari Perintah Atau Skrip Shell Adalah Stdout Atau Stderr?

  1. Tampilkan Hanya Stderr Di Layar Tetapi Tulis Stdout Dan Stderr Ke File?

  2. Cara mengarahkan output ke file dan stdout

  3. Bagaimana cara mengarahkan stderr dan stdout ke file berbeda di baris yang sama dalam skrip?

  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  3. Tentukan apakah outputnya stdout atau stderr