it-swarm.asia

bash: kırmızı renkte baskı stderr

Bash ekran yapmanın bir yolu var mı stderr kırmızı renkli mesajlar?

124
kolypto
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
103
Balázs Pozsár

Yöntem 1: İşlem ikamesi kullanın:

command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)

Yöntem 2: bir bash komut dosyasında bir işlev oluşturma:

color()(set -o pipefail;"[email protected]" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1

Şöyle kullanın:

$ color command

Her iki yöntem de komutun stderr kırmızısını gösterir.

Yöntem 2'nin nasıl çalıştığına dair bir açıklama için okumaya devam edin. Bu komut tarafından gösterilen bazı ilginç özellikler var.

  • color()... - Renk adı verilen bir bash işlevi oluşturur.
  • set -o pipefail - Çıkışı başka bir komuta aktarılan bir komutun hata dönüş kodunu koruyan bir Kabuk seçeneğidir. Bu, dış Kabuktaki boru boşluğu seçeneğini değiştirmemek için parantez tarafından oluşturulan bir alt kabukta yapılır.
  • "[email protected]" - İşlevin bağımsız değişkenlerini yeni bir komut olarak yürütür. "[email protected]", "$1" "$2" ... İle eşdeğerdir
  • 2>&1 - Komutun stderr 'sini stdout konumuna yönlendirir, böylece sed' s stdin olur.
  • >&3 - 1>&3 İçin kestirme, bu stdout 'i yeni bir geçici dosya tanımlayıcısına 3 Yönlendirir. 3 Daha sonra stdout klasörüne yönlendirilir.
  • sed ... - Yukarıdaki yönlendirmeler nedeniyle, sed 's stdin yürütülen komutun stderr' dir. İşlevi, her satırı renk kodlarıyla çevrelemektir.
  • $'...' Ters eğik çizgiden kaçan karakterleri anlamasına neden olan bir bash yapısı
  • .* - Tüm çizgiyle eşleşir.
  • \e[31m - Aşağıdaki karakterlerin kırmızı olmasına neden olan ANSI çıkış sırası
  • & - Eşleşen tüm dizeye (bu durumda tüm satır) genişleyen sed değiştirme karakteri.
  • \e[m - Rengi sıfırlayan ANSI kaçış dizisi.
  • >&2 - 1>&2 İçin kestirme, bu sed 's stdout' i stderr 'e yönlendirir.
  • 3>&1 - Geçici dosya tanımlayıcı 3stdout içine yönlendirir.
93
killdash9

Ayrıca stderred'e de göz atabilirsiniz: https://github.com/sickill/stderred

29
sickill

Sürekli kırmızı stderr yapmanın bash yolu, akışları yeniden yönlendirmek için 'exec' kullanmaktır. Bashrc'nize aşağıdakileri ekleyin:

exec 9>&2
exec 8> >(
    while IFS='' read -r line || [ -n "$line" ]; do
       echo -e "\033[31m${line}\033[0m"
    done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
Prompt_COMMAND='undirect;'

Daha önce bu konuda yayınladım: STDOUT ve STDERR için yazı tipi rengi nasıl ayarlanır

17
gospes
14
quaie

Balázs Pozsár'ın cevabını saf bash'a uygulayan bir sarıcı senaryo hazırladım. Çıktılarını renklendirmek için $ PATH ve önek komutlarına kaydedin.

 
 #!/bin/bash 
 
 eğer [$ 1 == "--help"]; sonra 
 echo "Bir komut yürütür ve oluşan tüm hataları renklendirir" 
 echo "Örnek:` basename $ {0} `wget ..." 
 echo "(c) o_O Tync , ICQ # 1227-700, Keyfini çıkarın! "
 Çıkış 0 
 Fi 
 
 # Tüm hataları yakalamak için geçici dosya 
 TMP_ERRS = $ (mktemp ) 
 
 # Komutu çalıştır 
 "$ @" 2>> (okuma satırında; echo -e yap "\ e [01; 31m $ line\e [0m" | tee - append $ TMP_ERRS; tamamlandı) 
 EXIT_CODE = $? 
 
 # Tüm hataları tekrar göster 
 eğer [-s "$ TMP_ERRS"]; sonra 
 echo -e "\ n\n\n\e [01; 31m === HATA ===\e [0m" 
 cat $ TMP_ERRS 
 fi 
 rm -f $ TMP_ERRS 
 
 # Bitir 
 çıkış $ EXIT_CODE 
 
7
kolypto

Bunun gibi bir işlev kullanabilirsiniz


 #!/bin/sh

color() {
      printf '\033[%sm%s\033[m\n' "[email protected]"
      # usage color "31;5" "string"
      # 0 default
      # 5 blink, 1 strong, 4 underlined
      # fg: 31 red,  32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
      # bg: 40 black, 41 red, 44 blue, 45 purple
      }
string="Hello world!"
color '31;1' "$string" >&2
</ Code>

Stderr'a yazdırmak için> 2 ekliyorum

3
Ali Mezgani

Bu çözüm benim için çalıştı: https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr

Bu işlevi benim .bashrc veya .zshrc:

# Red STDERR
# rse <command string>
function rse()
{
    # We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
    # Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
    ((eval $(for phrase in "[email protected]"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}

Sonra örneğin:

$ rse cat non_existing_file.txt

bana kırmızı bir çıktı verecek.

1
Eyal Levin

xargs ve printf kullanarak:

command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)
1
Carlos Barcellos

O_o Tync komut dosyasının biraz değiştirilmiş bir sürümü var. OS X Lion için bu modları yapmam gerekiyordu ve mükemmel değil çünkü script bazen wrapped komutu yapmadan tamamlanıyor. Bir uyku ekledim ama eminim daha iyi bir yol var.

#!/bin/bash

   if [ $1 == "--help" ] ; then
       echo "Executes a command and colorizes all errors occured"
       echo "Example: `basename ${0}` wget ..."
       echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
       exit 0
       fi

   # Temp file to catch all errors
   TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1

   # Execute command
   "[email protected]" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
   EXIT_CODE=$?

   sleep 1
   # Display all errors again
   if [ -s "$TMP_ERRS" ] ; then
       echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
       cat $TMP_ERRS
   else
       echo "No errors collected in $TMP_ERRS"
   fi
   rm -f $TMP_ERRS

   # Finish
   exit $EXIT_CODE
1
Cliff

fifos kullanan bir sürüm

mkfifo errs
stdbuf -o0 -e0 -i0 grep . foo | while read line; do echo -e "\e[01;31m$line  \e[0m" >&2; done &
stdbuf -o0 -e0 -i0 sh $script 2>errs
0
untore