Kiedy używam less file1 file2
, oba pliki są wyświetlane w „przeglądarce mniej buforów”, ale less file1 file2 | cat
drukuje zawartość obu plików dołączonych do standardowego wyjścia. Skąd mniej wie, czy powinien wyświetlać „przeglądarkę mniej buforów” czy generować wyjście na standardowe wyjście dla następnego polecenia? Jaki mechanizm służy do tego?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, i zobaczyć, co wyjście dostać.stdout
nie jest czymś, co można „zapisać do pliku”. To jest cośwrite()
do ciebie .less
nie musi robić nic inaczej w zależności od tego, czy jego wyjściem jest plik, potok, gniazdo, urządzenie blokowe, czy cokolwiek innego. Liczy się tylko to, że nie jest tty, więc po prostu się zachowujecat
. (Zakładam, że o tym wiedziałeś i po prostu wybrałeś niewłaściwe słowa, aby to wyjaśnić, ale pomyślałem, że wskazałbym to innym czytelnikom).less
nie „ wymyśla ”, cocat
będzie dalej. Po prostu zachowuje się jakcat
niezależnie od tego, co będzie dalej, jeśli jego standardowe wyjście nie jest tty.less
zgadłem, że skorzystam z jednego TCGETS, aby uzyskać wymiary terminala lub odkryć, że to nie jest tty, ale najwyraźniej pomyliłem się.less
sprawdza, czystdout
jest to terminal i zachowuje się tak, jakcat
nie jest (kopiuje standardowe wejście na standardowe wyjście, aż do EOF).Ta funkcja pozwala pisać skrypty lub programy, które zawsze wysyłają dane wyjściowe (np. Dane
--help
wyjściowe),less
jednocześnie umożliwiając łatwe przekierowanie do pliku. Byłoby do bani, gdybysome_command --fullhelp > help.txt
nadal czekał na spację na stdin, aby przewinąć tekst lub coś w tym rodzaju. Niektóre polecenia (np.man
) Sprawdzają, czy ich dane wyjściowe decydują, czy wysłać dane wyjściowe za pomocą pagera, czy nie. Jeśli biegnieszman ls > ls.txt
, nigdy nie wywołuje twojego$PAGER
.less
Zachowanie przypominające kota jest przydatne, jeśli zapomnisz edytować go z jednej linii podczas dodawania kolejnych etapów do rurociągu.less
musi obliczyć wymiary terminala (rozmiar ekranu, aby wiedzieć, ile linii ma pokazać jednocześnie).ioctl(2)
Używa onstdout
wróci ENOTTY na non-końcowy, więc nie można uniknąć manipulowania niekońcową sprawę tak.less
faktycznie używaisatty(3)
przed sprawdzeniem wymiarów terminala, aleisatty
działa, próbując ioctl-a tylko tty i sprawdzając brak błędu.Nawet prosty pager jak
more(1)
(przynajmniej wersja util-linux) ma tę funkcję, ponieważ jest to prawdopodobnie najprostsze rozsądne zachowanie, które można zastosować w tym przypadku.Zauważ, że kiedy wpinasz coś do
less
(np.grep foo bar.txt | less
), Musi się otwierać/dev/tty
na klawiaturę. (Możesz to zobaczyć za pomocąecho foo | strace less
).źródło