GNU/Linux >> Belajar Linux >  >> Linux

Apakah mungkin membuat keluaran stdout dan stderr menjadi warna berbeda di XTerm atau Konsole?

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 — Mengarahkan stderr dari perintah ke stdout sehingga menjadi sed stdin .
  • >&3 — Singkatan dari 1>&3 , ini mengalihkan stdout ke deskriptor file sementara yang baru 3 . 3 dialihkan kembali ke stdout nanti.
  • sed ... — Karena pengalihan di atas, sed stdin adalah stderr 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 dari 1>&2 , ini mengalihkan sed stdout ke stderr .
  • 3>&1 — Mengarahkan deskriptor file sementara 3 kembali ke stdout .

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.


Linux
  1. Redirect semua output ke file di Bash

  2. Gema ke stdout dan stderr

  3. Apakah aman untuk menonaktifkan buffering dengan stdout dan stderr?

  1. Piping stdout dan stderr di dalam aturan Makefile

  2. Memulihkan stdout dan stderr ke nilai default

  3. Mungkinkah deskriptor file linux 0 1 2 bukan untuk stdin, stdout dan stderr?

  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Warna berbeda untuk perintah dan output

  3. Menangkap STDERR dan STDOUT ke file menggunakan tee