Podczas automatyzacji zadania warto najpierw przetestować je ręcznie. Byłoby jednak pomocne, gdyby jakiekolwiek dane idące do stderr były natychmiast rozpoznawalne jako takie i odróżnialne od danych idących na standardowe wyjście, i aby wszystkie dane wyjściowe były zebrane razem, więc jest oczywiste, jaka jest sekwencja zdarzeń.
Ostatni dotyk, który byłby miły, to to, że przy wyjściu programu wypisuje swój kod powrotu.
Wszystkie te rzeczy pomogłyby w automatyzacji. Tak, mogę powtórzyć kod powrotu po zakończeniu programu i tak, mogę przekierować stdout i stderr; to, co naprawdę chciałbym, to jakaś powłoka, skrypt lub łatwy w użyciu readresator, który pokazuje stdout na czarno, pokazuje stderr przeplatany z nim na czerwono i drukuje kod wyjścia na końcu.
Czy jest taka bestia? [Jeśli to ważne, używam Bash 3.2 na Mac OS X].
Aktualizacja : Przepraszam, że minęły miesiące, odkąd na to spojrzałem. Wymyśliłem prosty skrypt testowy:
#!/usr/bin/env python
import sys
print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"
W moich testach (i prawdopodobnie ze względu na sposób buforowania), rse i hilite wyświetlają wszystko od standardowego, a potem od standardowego. Metoda FIFO porządkuje porządek, ale wydaje się, że wszystko koloryzuje zgodnie z linią stderr. ind narzekał na moje linie stdr i stderr, a następnie odłożył wyjście z stderr na końcu.
Większość z tych rozwiązań jest wykonalna, ponieważ nie jest nietypowe, że tylko ostatni wynik przechodzi do stderr, ale nadal byłoby miło mieć coś, co działałoby nieco lepiej.
Odpowiedzi:
Możesz także sprawdzić stderred: https://github.com/sickill/stderred
źródło
Właśnie opracowałem szaloną metodę z udziałem FIFO.
Jeśli chcesz, aby wyjście stderr było oddzielne, możesz otworzyć dwie osobne powłoki i uruchomić „
grep --color . foo
” w jednym bez&
, a następnie uruchomić polecenie w drugim (nadal z2>foo
). Dostaniesz stderr wgrep
jednym, a stdout w głównym.Działa to, ponieważ wyjście stderr jest kierowane przez FIFO do
grep --color
, którego domyślnym kolorem jest czerwony (przynajmniej dla mnie). Kiedy skończysz, wystarczyrm
FIFO (rm foo
).Zastrzeżenie : Naprawdę nie jestem pewien, jak to będzie obsługiwać kolejność wyjściową, będziesz musiał to przetestować.
źródło
Tak, jest to możliwe. Zobacz dział „Zmień STDERR na czerwony” na tej stronie, aby znaleźć działający przykład.
Podstawowy kod jest taki
Krótkie wyjaśnienie znajduje się w samej funkcji. Przesuwa STDOUT i STDERR, więc sed pobiera STDERR w 1, koloruje go, a następnie zamienia z powrotem. Potraktuj strumień pliku 3 jako zmienną temp tutaj.
Połączenie jest dość proste
Jednak niektóre wywołania nie będą działać zgodnie z oczekiwaniami; wszystkie zastrzeżenia znajdują się na połączonej stronie.
Przy okazji, myślę, że możliwe jest również rozwiązanie tego formularza
gdzie rse pokoloruje wydruk.
Znalazłem też ten hilite projekt, który wydaje się to robić. Nie wypróbowałem tego, ale to może być to, czego szukasz.
Inne powiązane projekty:
źródło
Innym programem jest ind:
http: // www.habets.pp.se/synscan/programs.php?prog=ind (sam musisz skompletować hiperłącze, nie mam wystarczającej liczby punktów dla więcej niż jednego na odpowiedź). Jest tam zrzut ekranu, a nawet zrzut ekranu.
Prowadzi podproces w pty, czego inni prawdopodobnie nie robią. Może to mieć znaczenie tam, gdzie liczy się kolejność (często tak jest), ponieważ stderr jest natychmiast opróżniany w terminalach, a stdout jest w pełni buforowany, gdy nie jest tty.
Aby uzyskać pełne wyjaśnienie, zobacz: http://blog.habets.pp.se/2008/06/Buffering-in-pipes
Ind działa również z interaktywnymi programami i znakami kontrolnymi. Bash działa tak jak normalnie, gdy zaczyna się od „ind bash -i”.
Może to działać w celu uzyskania kolorów przy jednoczesnym zachowaniu Ctrl-P i in.
źródło
Oto wiele odpowiedzi na temat podświetlania wyników stderr. Mogę dodać tylko jeden dość łatwy - w jednym rzędzie, który dołączasz do polecenia:
Ale za każdym razem musisz to dodać po poleceniu.
Ja osobiście podoba mi się możliwość wspomniana przez @nagul, funkcja rse dodana do bashrc.
Ale chcę dodać rozwiązanie do drukowania kodu wyjścia. Możesz dodać tę wartość na początku wiersza polecenia bash:
Gdzie EC jest kodem wyjścia polecenia.
Mam to ustawione w taki sposób, że gdy kod wyjścia ma wartość 0, nie zostanie wydrukowany, ale każda inna wartość zostanie wydrukowana przed następnym monitem w kolorze czerwonym.
Cała sztuczka odbywa się w ~ / .bashrc:
Wiersz zachęty jest domyślnie zdefiniowany przez zmienną PS1. Skopiuj cokolwiek masz tutaj do zmiennej PROMPT, a następnie utwórz zmienną PS1 z kodem wyjścia lub bez.
Bash wyświetli informację w zmiennej PS1 w pytaniu.
źródło
jest
annotate-output
narzędzie (devscripts
pakiet Debian), jeśli chcesz to zrobić bez kolorówźródło