`doker loguje foo | less` nie jest przeszukiwalny ani przewijalny, ale `docker loguje foo 2> i 1 | mniej jest

10

Użycie jednego z nich daje czytelny tekst. Ale tylko z przekierowaniem stderr można przewijać lub pisać / somepattern i uzyskiwać dopasowania.

Bez tego wyszukiwanie daje „Nic do wyszukiwania (naciśnij RETURN)” i kolumnę ~.

Biorąc pod uwagę, że stderr i stdout nie są takie same, ale dlaczego mniej pokazuje im to samo, dopóki nie zacznę robić czegoś w mniejszym?

To może jakaś dziwna rzecz z wieloma oknami, której po prostu nie rozumiem. Myśli?

MagicWindow
źródło

Odpowiedzi:

7
+--------------------+        +------+       +----------+
|             stdout |·······→| less |——————→|          |
| somecommand        |        +------+       | terminal |
|             stderr |——————————————————————→|          |
+--------------------+                       +----------+

Jeśli somecommanddrukuje tekst do standardowego błędu tylko, następnie po uruchomieniu somecommand | less, somecommandi lesssą zarówno wyświetlanie do terminalu. Dane wyjściowe polecenia na jego stderr nie zmienią się less, lecz trafią bezpośrednio do terminala, ponieważ nie są przekierowywane. Najpierw wyjście somecommandzwojów przez while less inicjuje i pokazuje wiersz zachęty; wtedy, gdy somecommandskończy mniej, zauważy, że wprowadzanie zostało zakończone (ponieważ potok jest zamknięty). Możesz trochę poeksperymentować: uruchom

{ sleep 1; somecommand; sleep 1; } | { sleep 0; less; }

oraz zmiany czasów snu, aby somecommanduzyskać wynik przed lub po mniejszej gotowości, i zobaczyć, co się stanie, gdy rura zostanie zamknięta.

Gilles „SO- przestań być zły”
źródło