Jak wydrukować standardowy błąd na czerwono

14

Jak wydrukować standardowy błąd na czerwono w konsoli zamiast używać tego samego koloru standardowego wyjścia?

Czy jest to możliwe przy użyciu Gnome Terminal ?

Aslan986
źródło
Ten link może ci pomóc
devav2,
Możesz włączyć to zachowanie dla jednego polecenia za pomocą hilitenarzędzia . Musisz ręcznie dodać hilitepolecenie do powłoki, aby go użyć, ale nadal jest to przydatne, jeśli wiesz lub podejrzewasz, że polecenie generuje błędy i chcesz je zlokalizować.
Rory O'Kane

Odpowiedzi:

8

Używam stderreda i znalazłem dobre rozwiązanie. Jak zauważa w pliku readme :

Stderred przechwytuje zapis () i rodzinę funkcji strumieniowych (fwrite, fprintf, error ...) z libc w celu pokolorowania wszystkich danych wyjściowych stderr, które trafiają do terminala, dzięki czemu można je odróżnić od standardowego wyjścia. Zasadniczo zawija tekst, który trafia do pliku z deskryptorem „2” z odpowiednimi kodami specjalnymi ANSI, dzięki czemu tekst jest czerwony.

Jest zaimplementowany jako biblioteka współdzielona i nie wymaga ponownej kompilacji istniejących plików binarnych dzięki funkcji wstępnego ładowania / wstawiania dynamicznych linkerów.

Jest obsługiwany w systemie Linux (z LD_PRELOAD), FreeBSD (również LD_PRELOAD) i OSX (z DYLD_INSERT_LIBRARIES).

Kompilacja jest prosta, ale musisz ją skompilować ze źródła, postępując zgodnie z instrukcjami z witryny Github :

sudo apt-get install build-essential git cmake 

Następnie

git clone git://github.com/sickill/stderred.git
cd stderred

Następnie

make

Najważniejszą częścią jest dodanie odpowiedniej linii do twojego .bashrc; musisz połączyć się z libstderred.soplikiem w katalogu kompilacji; musisz użyć bezwzględnej ścieżki, w której znajduje się katalog kompilacji (/ home / mike / src / stderred / build). Dodaję do mojego .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Oczywiście, jeśli nie chcesz już z niego korzystać, usuń powyższą linię z .bashrci ponownie uruchom terminal.

Wyniki przetestowane na nieistniejących plikach (oczywiście nie będzie działać, gdy sudozostanie użyte, ponieważ użytkownik .bashrcnie będzie czytany, gdy ustawione jest inne środowisko):

(Nawiasem mówiąc, to nie zmienia mojego monitu księcia @ nukem na czerwony, ponieważ był już czerwony )

wprowadź opis zdjęcia tutaj


źródło
Nie mogę uwierzyć, że spędziłem tyle lat, nie wiedząc, że to istnieje! Jest niezwykle przydatny i powinien być częścią systemu operacyjnego przez około sto lat. :)
Roger Dahl,
6

Ogólnie tak, ponieważ Gnome Terminal jest terminalem ANSI i obsługuje standardowe kody ucieczki ANSI.

Oto przykład. Wpisz to w swoim terminalu:

echo -e "\e[01;31mREDRUM\e[0m"

-eOpcja pozwala zinterpretować kody odwrotnego ukośnika, tak że \estaje się „Esc” (kod szesnastkowy 0x1b). Alternatywnie, aby bezpośrednio wprowadzić ucieczkę, naciśnij ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape i [oba tworzą razem kod rozpoznawany przez terminal. Po tej sekwencji należy wstawić ;listę atrybutów oddzieloną dwukropkiem ( ), zakończoną przez m. Patrz tutaj dla wszystkich kodów. Przykłady obejmują atrybut 0(zresetuj wszystkie atrybuty, jak można zauważyć powyżej, czyli sekwencję kończącą mój przykład) i garść stylu (podkreślone, jasne, pogrubione itp.), A także kilka atrybutów kolorów.

Powyższa odpowiedź mówi, jak używać koloru podczas pisania własnego programu.

Jeśli jednak dobrze rozumiem twoje pytanie, chciałbyś mieć wizualną separację dla stderr i stdout wszystkich uruchomionych programów. Nie jest to proste bez analizowania ich wyników przez filtr. Oto przykład (znaleziony tutaj ), jak to zrobić:

  1. Zdefiniuj funkcję (możesz umieścić ją w pliku .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Uruchom programy takie jak to:

    color program
    

Stderr z programów zmieni kolor na czerwony.

styczeń
źródło
czy jest jakiś sposób, aby pokolorować komunikat o błędzie z dowolnego programu?
Łukasz