Podążasz za fajką, zużywając mniej?


25

Czy mniej może (po naciśnięciu F) wejść potokowych (podobnie jak plik)? W przypadku pliku, który jest zapisywany, polecenie

less <file>

podąży za plikiem po naciśnięciu F.

Ale jeśli mam polecenie, które potokuje wyjście bezpośrednio na mniej, w ten sposób

command | less

naciśnięcie F nic nie da.

Wygląda więc na to, że potoki nie mogą być śledzone tak jak pliki? A może ma to związek z poleceniem pisania również do STDERR? Efekt, który próbuję osiągnąć, to zawsze zobaczyć najnowsze wyjście polecenia: tak jak przytrzymanie wciśniętego PageDown!

Powiązana uwaga dotyczy G (przejdź do końca): gdy przesyłanie bezpośrednio do mniejszej ilości, nie zadziała.


Odpowiedzi:


21

Naciśnięcie Flub Gpowoduje lessprzejście do wejścia EOF. Jeśli wejściem jest rura, lesszawiesza się, aż rura zostanie zamknięta po drugiej stronie (a nie „nic nie robi”).

Można to obejść, zapisując dane wyjściowe polecenia w pliku tymczasowym w tle, a następnie używając go jako danych wejściowych dla less:

command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x

Nie ma opcji, aby zrobić to lesstylko; Przyznaję jednak, że byłoby to przydatne.


Jeśli wejściem jest rura, lesszawiesza się, aż rura zostanie zamknięta po drugiej stronie . To rodzaj wprowadzającego w błąd oświadczenia. Co się dzieje, to mniej połączeń readw trybie blokowania, czekając na nowe dane lub zamknięcie potoku.
Piotr Dobrogost

3
Po naciśnięciu F lub G na wejściu potoku lessnie tylko odczytuje blokowanie, ale robi to w pętli czekającej na EOF. A EOF na rurze zdarza się tylko wtedy, gdy jego druga strona jest zamknięta.
mik

3
Gdyby lesszaktualizować ekran w tej pętli, nie byłoby problemu. Blokowanie odczytu nie ma wiele wspólnego z tym problemem.
mik

1
@ Przepływ nie jest to zawieszenie, o które chodziło, ale jedynie oczekiwanie, które jest oczekiwane w tej sytuacji - oczekiwanie na więcej danych w pliku po osiągnięciu EOF (nawiasem mówiąc, nie nastąpi to dla zamkniętego potoku), lub przerwanie, aby wyjść z trybu śledzenia
mik

1
@PiotrDobrogost z blokowaniem odczytu lessnie byłby w stanie zaktualizować ekranu, jeśli nie ma danych; gdy pojawią się jakieś dane, zablokowanie odczytu zwróci je i lessbędzie mógł zaktualizować ekran bez osobnego wątku
mik

6

Czy mniej może (po naciśnięciu F) wejść potokowych (podobnie jak plik)?

Tak, począwszy od wersji 474. Jednak nie jest jeszcze wspomniany w informacjach o wydaniu żadnej wersji, ponieważ obecnie pozostaje jeden problem z tą funkcją. Poniżej znajduje się komentarz opiekuna less - Mark Nudelman:

Jeśli chodzi o polecenie F na rurach, zostało to również naprawione w less-474. Zamiast szukać EOF, komenda F szuka końca buforowanego wejścia i zaczyna tam czytać. Jednak nie jest to naprawdę przydatne, ponieważ naciśnięcie CTRL-C w celu zatrzymania polecenia F powoduje zabicie procesu produkującego dane wyjściowe. Nie jestem pewien, jak to naprawić.

Dopóki ten problem nie zostanie rozwiązany, można go obejść za pomocą funkcji powłoki. Zobacz moją odpowiedź na Czy jest jakiś sposób na wyjście z trybu śledzenia „mniej” bez zatrzymywania innych procesów w potoku? pytanie o szczegóły.

Dla porównania, problem z F niedziałającym z potokami ma numer referencyjny 300 na liście znanych błędów i jest zatytułowany Polecenie F nie działa na wejściach potokowych.


Powiązana uwaga dotyczy G (przejdź do końca): gdy przesyłanie bezpośrednio do mniejszej ilości, nie zadziała.

Działa od wersji 466. Powołując się na informacje o wydaniu tej wersji:

Nowe polecenie ESC-G przechodzi na koniec aktualnie buforowanych danych w potoku


Polecenie ESC-G zostało wprowadzone w wersji 466, wydanej 23 sierpnia 2014 r.
mik

@mik Wygląda wtedy na błąd w informacjach o wersji dla wersji 471. Dzięki, naprawione.
Piotr Dobrogost

Nie jest to błąd, po prostu wymieniają zmiany stopniowo od wydania stabilnego, w tym przypadku w wersji 458. Jednak nie ma stabilnej wersji z poleceniem ESC-G.
mik

Komenda ESC-G jest teraz w stabilnej wersji (481): „16 października 2015 mniej-481 zostało wydane do ogólnego użytku”.
mik

Aktualizacja: Jeśli chodzi o polecenie F na rurach, zostało to również naprawione w wersji mniejszej niż 474. Zamiast szukać EOF, komenda F szuka końca buforowanego wejścia i zaczyna tam czytać. Jednak nie jest to naprawdę przydatne, ponieważ naciśnięcie klawiszy Ctrl-C w celu zatrzymania polecenia F powoduje zabicie procesu produkującego dane wyjściowe. Nie jestem pewien, jak to naprawić. - Mark Nudelman, opiekun mniej
Piotr Dobrogost

2

Z mniejszej strony podręcznika

[Keyboard] COMMANDS [...]

   F      Scroll  forward, and keep trying to read when the end of file is reached.  Normally this command would be used when already
          at the end of the file.  It is a way to monitor the tail of a file which is growing while it is being viewed.  (The  behav‐
          ior is similar to the "tail -f" command.)

więc to powinno działać i faktycznie działa dla mnie.


1
To polecenie zachowuje się inaczej, gdy jest używane z potokiem zgodnie z opisem @mik i wyraźnie nie jest tym, czego szuka OP.
Piotr Dobrogost
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.