Wie wird "cat" oder "less" verwendet, abhängig von der Zeilenanzahl?

12

Wenn ich den Inhalt von Dateien betrachte, möchte ich automatisch catDateien lesskurzschließen, die jedoch die Bildschirmgröße überschreiten. Ich könnte etwas mit verwenden wc -l, aber gibt es einen besseren Weg, der vielleicht auch die Fenstergröße / aktuelle Anzahl der verfügbaren Zeilen berücksichtigt?

Tobias Kienzler
quelle
1
Beachten Sie, dass dies bei vielen Tools die Erwartungshaltung beeinträchtigt. Dh der Benutzer kann nicht im Voraus wissen, was passieren wird. Ich finde das zum Beispiel nervig, in git logdem genau das passiert. Sie wissen nie im Voraus, was Sie bekommen werden (müssen Sie schlagen q?).
Bitmaske
4
HINWEIS: Im Allgemeinen sollten Sie das catAnzeigen von Dateien vermeiden . Normalerweise sollten Sie nur catden Inhalt einer Datei an stdout senden, damit sie an einen anderen Prozess weitergeleitet werden kann. Der Grund für das Vermeiden der Verwendung catzum Anzeigen ist, dass die unformatierten Bytes an das Terminal gesendet werden, was dazu führen kann, dass unerwartete Terminalbefehle ausgeführt werden. . Normalerweise sollten Sie einen Pager lessoder einen Editor verwenden, der Sonderzeichen für die Anzeige formatiert, damit sie vom Terminal nicht interpretiert werden.
Chris Seite
2
Wenn Sie cat verwenden, um Dateiinhalte direkt im Terminal anzuzeigen, verwenden Sie cat -ves zumindest, damit Sonderzeichen ausgeblendet werden.
Chris Seite
@bitmask guter Punkt, deshalb habe ich gefragt Ist Split-Screening catmöglich? Das könnte eine bessere Lösung sein
Tobias Kienzler
@ChrisPage Meine Tastatur wurde nicht getötet, aber ich denke , dass ich es geschafft , die Codepage vermasseln einmal ... Vielen Dank für den Hinweis cat -vaus
Tobias Kienzler

Antworten:

9

Um Ihnen die Formel mit der wc-basierten Prüfung zu geben:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Es gibt eine $LINESShell-Variable, die auch verwendet werden kann:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Aber $LINESwird nur aktualisiert , wenn an der Eingabeaufforderung. Um zu verstehen, was ich meine, führen Sie dies aus und ändern Sie die Größe des Terminalfensters während sleep:

( sleep 3; echo $LINES; tput lines )
Mann bei der Arbeit
quelle
Dies hat den Vorteil, dass es bereits eingestellt werden kann, lesswenn zB 2/3 des Bildschirms von verwendet werden cat.
Tobias Kienzler
20

Möglicherweise ist 'less -F file_to_read' die Option: Es wird weniger beendet, wenn das Fenster ausreicht, um die gesamte Datei anzuzeigen, und auf den Pager gewartet, wenn dies nicht der Fall ist

Dom
quelle
Hört sich gut an, aber das gibt in diesem Fall nichts aus, und die Exit-Codes sind in beiden Fällen gleich
Tobias Kienzler
Ich versuche einfach 'less -F / etc / passwd' und es zeigt die Datei korrekt an (mit oder ohne Pager). Sie haben Recht, der Rückkehrcode ist in beiden Fällen 0.
Dom
11
Dieser Befehl funktioniert wie angefordert, aber mit einem kleinen Fehler: Er löscht den Bildschirm nach dem Anzeigen der Datei. Durch Hinzufügen der -XOption wird das Löschen abgebrochen, sodass kurze Dateien angezeigt werden, wie dies auch der catFall ist. Leider wird mit -Xdem Bildschirm auch nach dem Anzeigen langer, gescrollter Dateien nichts gelöscht.
Manatwork
1
@manatwork das ist toll, danke. Nicht den Bildschirm Löschen ist eigentlich ganz in Ordnung, denn das ist , was würde (nicht) passieren , wenn catgenannt wurden auch
Tobias Kienzler