Bash ekran yapmanın bir yolu var mı stderr kırmızı renkli mesajlar?
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
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ğerdir2>&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ı 3
'İ stdout
içine yönlendirir.Ayrıca stderred'e de göz atabilirsiniz: https://github.com/sickill/stderred
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
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
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
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.
xargs ve printf kullanarak:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)
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
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