Inilah solusi yang menggabungkan beberapa ide bagus yang sudah disajikan.
Buat fungsi dalam skrip bash:
color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
Gunakan seperti ini:
$ color command -program -args
Ini akan menampilkan perintah stderr
berwarna merah.
Baca terus untuk penjelasan tentang cara kerjanya. Ada beberapa fitur menarik yang ditunjukkan oleh perintah ini.
color()...
— Membuat fungsi bash bernama color.set -o pipefail
— Ini adalah opsi shell yang mempertahankan kode pengembalian kesalahan dari perintah yang hasilnya disalurkan ke perintah lain. Ini dilakukan dalam subkulit, yang dibuat oleh tanda kurung, agar tidak mengubah opsi pipefail di kulit terluar."[email protected]"
— Mengeksekusi argumen ke fungsi sebagai perintah baru."[email protected]"
setara dengan"$1" "$2" ...
2>&1
— Mengarahkanstderr
dari perintah kestdout
sehingga menjadised
stdin
.>&3
— Singkatan dari1>&3
, ini mengalihkanstdout
ke deskriptor file sementara yang baru3
.3
dialihkan kembali kestdout
nanti.sed ...
— Karena pengalihan di atas,sed
stdin
adalahstderr
dari perintah yang dieksekusi. Fungsinya untuk mengelilingi setiap garis dengan kode warna.$'...'
Konstruksi bash yang membuatnya memahami karakter yang di-escape dengan garis miring terbalik.*
— Mencocokkan seluruh baris.\e[31m
— Urutan escape ANSI yang menyebabkan karakter berikut menjadi merah&
—sed
ganti karakter yang memperluas ke seluruh string yang cocok (seluruh baris dalam kasus ini).\e[m
— Urutan escape ANSI yang menyetel ulang warna.>&2
— Singkatan dari1>&2
, ini mengalihkansed
stdout
kestderr
.3>&1
— Mengarahkan deskriptor file sementara3
kembali kestdout
.
Berikut perluasan dari konsep yang sama yang juga membuat STDOUT ramah lingkungan:
function stdred() (
set -o pipefail;
(
"[email protected]" 2>&1>&3 |
sed $'s,.*,\e[31m&\e[m,' >&2
) 3>&1 |
sed $'s,.*,\e[32m&\e[m,'
)
Anda juga dapat melihat stderred:https://github.com/sickill/stderred
Saya tidak dapat melihat bahwa ada cara bagi emulator terminal untuk melakukan ini.
Antarmuka antara emulator terminal dan shell/aplikasi melalui pseudo-tty, di mana emulator terminal berada di sisi master dan shell/aplikasi di sisi lainnya. Shell/aplikasi memiliki stdout dan stderr yang terhubung ke pty yang sama, jadi ketika emulator terminal membaca dari pty untuk output shell/aplikasi, ia tidak dapat lagi mengetahui mana yang ditulis ke stdout dan mana ke stderr.
Anda harus menggunakan salah satu solusi yang mencegat data antara aplikasi dan slave-pty dan menyisipkan kode escape untuk mengontrol output terminal colo(u)r.