Szukam sposobu wizualnego oddzielenia stdout i stderr, aby się nie przeplatały i aby można je było łatwo zidentyfikować. Idealnie, stdout i stderr miałyby oddzielne obszary na ekranie, w których są wyświetlane, np. W różnych kolumnach. Na przykład dane wyjściowe, które wyglądałyby tak:
~$ some command
some useful output info
ERROR: an error
more output
ERROR: has occurred
another message
~$
zamiast tego wyglądałby mniej więcej tak:
~$ some command |
some useful output info |
more output | ERROR: an error
another message | ERROR: has occurred
~$ |
command-line
terminal
Zoey Hewll
źródło
źródło
Odpowiedzi:
Możesz użyć
screen
funkcji podziału pionowego GNU :Aby użyć na przykład jako:
Chodzi o to, że uruchamia on ekran z tymczasowym plikiem conf, który uruchamia dwa okna ekranu w układzie podziału pionowego. W pierwszym uruchamiamy twoje polecenie z stderr podłączonym do drugiego.
Używamy nazwanego potoku dla drugiego okna, aby przekazać jego urządzenie tty do pierwszego, a także dla pierwszego, aby poinformować drugie, kiedy polecenie zostanie wykonane.
Inną zaletą w porównaniu z podejściami opartymi na potokach jest to, że stdout i stderr polecenia są nadal podłączone do urządzeń tty, więc nie wpływa to na buforowanie. Oba panele można również przewijać niezależnie w górę i w dół (w
screen
trybie kopiowania).Jeśli uruchomisz powłokę podobnie jak
bash
interaktywnie z tym skryptem, zauważysz, że monit zostanie wyświetlony w drugim oknie, podczas gdy powłoka będzie czytać to, co wpiszesz w pierwszym oknie, gdy powłoki wyrzucają swój monit na stderr.W przypadku
bash
, w echo tego, co piszesz pojawi się również na drugim oknie jako że echo jest wyprowadzany przez powłokę (readline w przypadkubash
) na stderr, jak również. Z niektórych innych skorup podobaksh93
, to pokaże na pierwszym oknie ( echo wyjście na terminalu sterownika, a nie shell), chyba że można umieścić w powłokęemacs
lubvi
tryb zset -o emacs
lubset -o vi
.źródło
To brzydkie rozwiązanie oparte na
annotate-output
skrypcie Debiana ANNOTATE-OUTPUT (1) . Nie jestem pewien, czy tego właśnie szukasz, ale może być coś na początek:Możesz to przetestować za pomocą
./this_script another_script
lubcommand
.źródło
Spróbuję przeanalizować następującą część twojego pytania:
Jeśli ktoś chciałby rozbić to, co chcesz:
1)
stdout
Strumień nie kończyłby każdej linii znakiem,CR LF
ale zamiast niego znakiem „|” postać. Oczywiście nie wyrównałoby to dwóch strumieni, a wyrównanie nie wchodzi w rachubę, ponieważ musiałoby przewidzieć długość przyszłych linii dodanych dostdout
, co oczywiście jest niemożliwe.2) Zakładając, że zapominamy o wyrównaniu, po prostu wyprowadzilibyśmy
stderr
po przetworzeniu przez potok, który dodaje „BŁĄD:” na początku każdej linii. Myślę, że jest to dość łatwe, tworząc prosty skrypt i upewniając się, żestderr
zawsze wychodzi przez ten skrypt.Ale to dałoby wynik:
Co tak naprawdę nie jest pomocne? Też nie wierzę, po to też jesteście!
Myślę, że problem z początkowym pytaniem polega na tym, że nie bierze się pod uwagę szeregowego charakteru każdej linii dołączonej do strumienia, w związku z tym, że oba strumienie mogą być zapisywane asynchronicznie.
Uważam, że najbliższym możliwym rozwiązaniem byłoby użycie
ncurses
.Widzieć.
[ http://www.tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/]
[ http://invisible-island.net/ncurses/ncurses-intro.html#updating]
Aby zrobić to, co chcesz, musisz buforować oba strumienie i połączyć je, aby utworzyć trzeci bufor, który pobiera elementy z obu buforów. Następnie zrzuć trzeci bufor do ekranu terminala, usuwając ekran terminala i odmalowując go za każdym razem, gdy zmienia się trzeci bufor. Ale tak to
ncurses
działa, więc po co wymyślać koło i nie zdejmować stamtąd?W każdym razie musisz przejąć sposób, w jaki ekran terminala jest całkowicie pomalowany ! I wyrównaj tekst w przedrukowanej wersji ekranu, jak chcesz. Podobnie jak gra wideo z terminalnymi postaciami.
Mam nadzieję, że moja odpowiedź będzie pomocna w wyjaśnieniu ograniczeń tego, czego szukasz ...
Przepraszam za powtórzenie tego, ale największym problemem z tym, co pokazałeś, jest to, w jaki sposób „procesor” strumieni
stdout
i będziestderr
wiedział z góry o długości dodanych do niego przyszłych linii w celu ich prawidłowego wyrównania.źródło