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:
Naciśnięcie Flub Gpowoduje
less
przejście do wejścia EOF. Jeśli wejściem jest rura,less
zawiesza 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
:Nie ma opcji, aby zrobić to
less
tylko; Przyznaję jednak, że byłoby to przydatne.źródło
less
zawiesza 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ńread
w trybie blokowania, czekając na nowe dane lub zamknięcie potoku.less
nie 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.less
zaktualizować ekran w tej pętli, nie byłoby problemu. Blokowanie odczytu nie ma wiele wspólnego z tym problemem.less
nie byłby w stanie zaktualizować ekranu, jeśli nie ma danych; gdy pojawią się jakieś dane, zablokowanie odczytu zwróci je iless
będzie mógł zaktualizować ekran bez osobnego wątkuTak, 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.
Działa od wersji 466. Powołując się na informacje o wydaniu tej wersji:
źródło
Z mniejszej strony podręcznika
więc to powinno działać i faktycznie działa dla mnie.
źródło