Jak używać „cat” lub „mniej” w zależności od liczby linii?

12

Przeglądając zawartość plików, chciałbym automatycznie catskracać pliki, ale lesste, które przekraczają rozmiar ekranu. Mógłbym czegoś użyć wc -l, ale czy istnieje lepszy sposób, który może uwzględniać również rozmiar okna / bieżącą liczbę dostępnych linii?

Tobias Kienzler
źródło
1
Chociaż wiele narzędzi to robi, należy pamiętać, że nie spełnia to oczekiwań. Oznacza to, że użytkownik nie może z góry wiedzieć, co się stanie. Uważam to za irytujące, na przykład, w git logktórym robi to dokładnie. Nigdy nie wiesz z góry, co dostaniesz (czy musisz trafić q?).
maska ​​bitowa
4
UWAGA: Ogólnie należy unikać używania catdo przeglądania plików. Zazwyczaj powinieneś używać tylko catdo wysyłania zawartości pliku na standardowe wyjście, aby można go było przesłać do innego procesu. Powodem, dla którego należy unikać używania catdo przeglądania, jest wysyłanie nieprzetworzonych bajtów do terminala, co może powodować wykonywanie nieoczekiwanych poleceń terminala (np. Niektórzy użytkownicy utknęli, gdy plik zawierał odpowiednie bajty do wyłączenia klawiatury terminala) . Zwykle powinieneś używać pagera lesslub edytora, który formatuje znaki specjalne do wyświetlania, aby nie były interpretowane przez terminal.
Chris Page
2
Jeśli zamierzasz użyć cat, aby wyświetlić zawartość pliku bezpośrednio w terminalu, przynajmniej użyj, cat -vaby unikał znaków specjalnych.
Chris Page
@bitmask dobry punkt, dlatego zapytałem Czy catmożliwe jest dzielenie ekranu ? co może być lepszym rozwiązaniem
Tobias Kienzler,
@ChrisPage Moja klawiatura nie zginął, ale myślę, że udało mi się zepsuć kodowej raz ... dzięki za zwrócenie cat -vsię
Tobias Kienzler

Odpowiedzi:

9

Aby podać formułę, która obejmuje wcsprawdzenie na podstawie:

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

Istnieje $LINESzmienna powłoki, której można również użyć:

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

Ale $LINESjest aktualizowany tylko wtedy, gdy w wierszu polecenia. Aby zrozumieć, co mam na myśli, uruchom to i zmień rozmiar okna terminala podczas sleep:

( sleep 3; echo $LINES; tput lines )
człowiek w pracy
źródło
Dzięki temu ma tę zaletę, że można go dostroić do użycia, lessjeśli np. 2/3 ekranu zostało wykorzystane cat.
Tobias Kienzler
20

Może „mniej -F plik_do_przeczytania” jest opcją: wychodzi mniej, jeśli okno jest wystarczające do wyświetlenia całego pliku, i poczekaj na pager, jeśli tak nie jest

Dom
źródło
brzmi dobrze, ale w tym przypadku nic nie wyświetla, a kody wyjścia są takie same w obu przypadkach
Tobias Kienzler,
Po prostu próbuję „mniej -F / etc / passwd” i wyświetla poprawnie plik (z pageriem lub bez). Masz rację, kod powrotu to 0 w obu przypadkach.
Dom
11
To polecenie działa zgodnie z żądaniem, ale z niewielką usterką: czyści ekran po wyświetleniu pliku. Dodanie -Xopcji zatrzyma czyszczenie, więc krótkie pliki będą wyświetlane tak jak catrobi. Niestety -Xekran nie zostanie wyczyszczony po wyświetleniu długich przewijanych plików.
manatwork
1
@manatwork to świetnie, dzięki. Brak czyszczenia ekranu jest w rzeczywistości w porządku, ponieważ tak by się stało (nie), gdyby catzostał również wezwany
Tobias Kienzler