Verfolgen Sie eine Pfeife mit weniger?

25

Kann weniger (durch Drücken von F) einer weitergeleiteten Eingabe folgen (ähnlich einer Datei)? Für eine Datei, in die geschrieben wird, der Befehl

less <file>

folgt der Datei, wenn Sie F drücken.

Aber wenn ich einen Befehl habe, den Pipes direkt in weniger ausgeben, so

command | less

Drücken von F wird nichts tun.

Wie es aussieht, können Pipes nicht wie Dateien verfolgt werden? Oder hat es vielleicht damit zu tun, dass der Befehl auch an STDERR schreibt? Der Effekt, den ich erzielen möchte, ist, immer die neueste Ausgabe des Befehls zu sehen: So als würde man PageDown gedrückt halten!

Eine verwandte Bemerkung gilt für G (zum Ende gehen): Wenn Sie direkt zu weniger leiten, funktioniert dies nicht.

haelix
quelle

Antworten:

21

Durch Drücken von Foder Gwird lessversucht, den Eingang EOF zu erreichen. Wenn es sich bei der Eingabe um eine Pipe handelt, bleibt sie lesshängen, bis die Pipe auf der anderen Seite geschlossen wird (und nicht "tut nichts").

Dies kann umgangen werden, indem die Befehlsausgabe in einer temporären Datei im Hintergrund gespeichert und dann als Eingabe für Folgendes verwendet wird less:

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

Es gibt keine Option, dies lessnur in zu tun ; Ich gebe jedoch zu, dass es nützlich wäre.

mik
quelle
Wenn die Eingabe eine Pipe ist, bleibt sie lesshängen, bis die Pipe auf der anderen Seite geschlossen wird . Das ist eine Art irreführende Aussage. Was passiert, ist, dass weniger Anrufe readin einem blockierenden Modus auf neue Daten oder das Schließen der Pipe warten .
Piotr Dobrogost
3
Nach dem Drücken von F oder G am Pipe-Eingang wird lessnicht nur ein blockierender Lesevorgang ausgeführt, sondern auch in einer Schleife, die auf EOF wartet. Und ein EOF an einem Rohr tritt nur auf, wenn seine andere Seite geschlossen ist.
mik
3
Wenn lessder Bildschirm in dieser Schleife aktualisiert würde, gäbe es kein Problem. Das Blockieren des Lesens hat mit diesem Problem wenig zu tun.
mik
1
@Flow das ist kein Hang, um den es in der Frage ging, sondern nur ein Warten, das in dieser Situation erwartet wird - ein Warten auf weitere Daten in der Datei, wenn EOF erreicht ist (was übrigens bei einer geschlossenen Pipe nicht der Fall ist), oder für eine unterbrechung, um den
verfolgungsmodus
1
@PiotrDobrogost mit blockierendem Lesevorgang lesskann den Bildschirm nicht aktualisieren, wenn keine Daten vorhanden sind. Wenn Daten lessangezeigt werden, die den
Lesevorgang
6

Kann weniger (durch Drücken von F) einer weitergeleiteten Eingabe folgen (ähnlich einer Datei)?

Ja, beginnend mit Version 474. Es wird jedoch noch nicht in den Versionshinweisen einer Version erwähnt, da derzeit noch ein Problem mit dieser Funktion besteht. Unten ist ein Kommentar des Betreuers von less - Mark Nudelman:

In Bezug auf den F-Befehl für Pipes ist dies auch in less-474 behoben. Anstatt nach EOF zu suchen, sucht der F-Befehl nach dem Ende der gepufferten Eingabe und beginnt dort mit dem Lesen. Es ist jedoch nicht wirklich verwendbar, da beim Drücken von STRG-C zum Stoppen des F-Befehls der Prozess abgebrochen wird, der die Ausgabe erzeugt. Ich bin mir nicht sicher, wie ich das beheben soll.

Solange dieses Problem nicht behoben ist, können Sie es mithilfe von Shell-Funktionen umgehen. Siehe meine Antwort auf Gibt es eine Möglichkeit, den Verfolgungsmodus „Weniger“ zu beenden, ohne andere Prozesse in der Pipe anzuhalten? Frage für Details.

Als Referenz hat das Problem mit F, das nicht mit Pipes arbeitet, die Referenznummer 300 in der Liste der bekannten Fehler und trägt den Titel Der Befehl F funktioniert nicht bei Pipe-Eingaben.


Eine verwandte Bemerkung gilt für G (zum Ende gehen): Wenn Sie direkt zu weniger leiten, funktioniert dies nicht.

Es funktioniert ab Version 466. von Unter Berufung auf Release Notes für diese Version:

Neuer Befehl ESC-G geht zum Ende der aktuell gepufferten Daten in einer Pipe

Piotr Dobrogost
quelle
Der Befehl ESC-G wurde in Version 466 eingeführt, die am 23. August 2014 veröffentlicht wurde.
mik
@mik Sieht dann aus wie ein Fehler in den Versionshinweisen für Version 471. Danke, behoben.
Piotr Dobrogost
Kein Fehler, sie listen die Änderungen nur inkrementell seit einer stabilen Version auf, in diesem Fall Version 458. Es gibt jedoch keine stabile Version mit dem Befehl ESC-G.
mik
Der Befehl ESC-G befindet sich jetzt in einer stabilen Version (481): "16. Oktober 2015 less-481 wurde für den allgemeinen Gebrauch freigegeben".
mik
Update: In Bezug auf den F-Befehl für Pipes ist dies auch in less-474 behoben. Anstatt nach EOF zu suchen, sucht der F-Befehl nach dem Ende der gepufferten Eingabe und beginnt dort mit dem Lesen. Es ist jedoch nicht wirklich verwendbar, da das Drücken von Strg-C zum Stoppen des F-Befehls den Prozess abbricht, der die Ausgabe erzeugt. Ich bin mir nicht sicher, wie ich das beheben soll. - Mark Nudelman, Betreuer von weniger
Piotr Dobrogost
2

Aus der less man Seite

[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.)

Das sollte also funktionieren und es funktioniert tatsächlich für mich.

artistoex
quelle
1
Dieser Befehl verhält sich anders, wenn er mit Pipe verwendet wird, wie von @mik beschrieben, und ist eindeutig nicht das, wonach OP sucht.
Piotr Dobrogost