Patrzę na wynik mojego skomplikowanego polecenia less
, problem polega na tym, że stderr
się gubię. stderr
linie zwykle są wymienione pomiędzy stdout
liniami wewnątrz less
. Chciałbym, aby były wydrukowane na konsoli, a kiedy wychodzę less
, aby zobaczyć je tam razem.
Zdaję sobie sprawę, że może nie być rozwiązaniem tego, czytałem o tee
, a multitee
jednak nie ma szczęścia do tej pory.
stderr
zostanie przekierowanystdout
, wszystkie dane wyjściowestderr
zostaną zmiksowane z włączonym normalnym wyjściemstdout
. Pipingowanie tego wyjścialess
pokaże oba.less
aby odmalować ekran.Odpowiedzi:
Może
Uzupełnienie
Poniżej znajduje się wyjaśnienie dla ludzi, którzy zaniedbują uważne przeczytanie pytania i którzy nie przeczytali powyższego komentarza PO.
haelix wskazał:
i w komentarzu do wczesnych odpowiedzi odpowiedział:
Problem prawdopodobnie dotyczy konkretnej platformy, z pewnością jest to coś, czego doświadczyłem na starszych platformach Unix SVR4.
Jeśli na takich platformach robisz coś takiego
wszelkie komunikaty o błędach (np. uprawnienia do katalogu) wyglądają mniej więcej tak
tak że linie wyjściowe są zasłonięte komunikatami o błędach.
Jeśli odświeżysz stronę, linie wyjściowe są wyświetlane poprawnie, ale tracisz komunikaty o błędach. Gdy wyjdziesz mniej, ekran zostanie wyczyszczony, z wyjątkiem wiersza polecenia.
Jeśli zrobisz coś takiego
Komunikaty o błędach są mieszane ze standardowym wyjściem. Ponownie, gdy wyjdziesz mniej, ekran jest pusty.
Jeśli chcesz najpierw przejrzeć tylko standardowe wyjście w mniej, a następnie zobaczyć komunikaty o błędach po mniejszym wyjściu, potrzebujesz innego rozwiązania.
Właśnie to sugerowałem wstępnie w mojej oryginalnej, dwuwierszowej odpowiedzi.
źródło
Musisz przekierować
stderr
dostdout
:Sprawdź instrukcję dla siebie powłoki (np
man bash
.)źródło
$ ./somecommad |& less
po prostu powiedz powłoce, aby przekierowała fd 2 na fd 1 (stderr na stdout)
źródło
Jedną z brakujących dotychczas odpowiedzi jest powód, dla którego tak się dzieje. Problemem jest tutaj pewien rodzaj wyścigu między procesem wysyłania danych do
stderr
iless
wyświetlaniem danych wyjściowych zstdout
terminala. Jeśliless
zacznie się wyświetlać po wydrukowaniu wszystkich danych wyjściowych dostderr
terminala,less
zachowa to i po wyjściu zobaczysz komunikatyless
. OTOH, jeśliless
już zaczął wyświetlać rzeczy, to komunikaty o błędach mieszają się zless
wyjściem i nic nie jest zachowywane poless
wyjściu (ponieważless
po prostu zachowuje terminal tak, jak był przed uruchomieniem i nie wie nic o komunikatach o błędach, które pojawiły się pomiędzy).Możesz to łatwo zobaczyć, jeśli np
Wszystkie komunikaty o błędach „Odmowa zezwolenia” mieszają się z danymi
less
wyjściowymi i po wyjściu nic nie będzie. Jeśli zrobiszwszystkie (lub przynajmniej większość) komunikatów o błędach zostały wydrukowane na terminalu, zanim
less
pojawi się szansa na wyświetlenie danych wyjściowych, a następnie zobaczysz komunikaty o błędach.Oczywiście zwykle nie chcesz czekać 10 sekund przed rozpoczęciem
less
, ale w Linuksie możesz również podać wartości ułamkowe dla czasu oczekiwania, a przy szybkich procesach częstosleep 0.1
wystarczy tak mało , aby uniknąć wyścigu. (Ale oczywiście, jeśli chcesz lub musisz być po naprawdę bezpiecznej stronie, skorzystaj z rozwiązania RedGrittyBrick).źródło
Musisz zrozumieć pojęcie „deskryptorów plików”. Zwykle aplikacja unixowa uruchamia się z trzema specjalnymi deskryptorami plików:
„Rura”
|
w powłoce łączy sięstdout
z jednego procesu z drugimstdin
.Błędy - z założenia - nie są
stdin
uwzględniane w następnym procesie. Często nie będą miały sensu w następnej aplikacji i nie powinny być ukryte przed użytkownikiem.Jeśli chcesz mieszać błędy w standardowe wyjście, możesz użyć np.
2>&1
, Który mówi w zasadzie „dołącz stderr do standardowego”. Na przykładpowinien również zawierać wyjście błędu z niedostępnych plików.
poda tylko błędy.
źródło
Jestem zdezorientowany co do twojego pytania, o ile mogę powiedzieć, że twoje pożądane zachowanie jest domyślne.
Kiedy używam
uzyskać prosty test,
robi tylko to, o co prosisz. To widzę
w
less
ikiedy odejdę
less
źródło
echo info ; echo error 1>&2
) i powtórz test: obie linie są potokowane do mniejszej.Zdarza mi się ostatnio spotkać ten problem w jednym z moich Debianów 5.0. na przykład ls abc | mniej uważam, że komunikat o błędzie przechodzi w mniej, co wbrew mojej wiedzy.
Po kilku próbach odkryłem, że jest to po prostu coś związanego z buforami ekranowymi. stderr tak naprawdę NIE wchodzi w mniej. Do demonstracji możesz użyć klawiszy strzałek w górę lub w dół (lub j / k).
źródło