===== Edycja linii poleceń =====
Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki [[https://en.wikipedia.org/wiki/GNU_Readline|readline]].
\\
Część programów z przyczyn licencyjnych wybiera do tego samego celu [[https://thrysoee.dk/editline/|libedit]].
Readline pozwala na wygodną edycję linii poleceń i tworzenie historii poleceń.
Lista sensownych skrótów klawiszowych do edycji linii poleceń (nie uwzględniająca strzałek) jest tutaj: https://readline.kablamo.org/emacs.html
\\
Pełna lista komend i przypisanych do nich skrótów jest w podręczniku systemowym \\ (''man readline'' i ''man bash'').
\\
Konwencja zapisu skrótów klawiszowych to:
* ''^//x//'' lub ''C-//x//'' to //Ctrl+x// (uwaga:''^//X//'' lub ''C-//X//'' to //Ctrl+Shift+x//),
* ''M-//x//'' to zwykle //Alt-x// (patrz: https://en.wikipedia.org/wiki/Meta_key),
* ''//a// //b//'' to wciśnięcie po skrócie //a// skrótu //b//.
Bash domyślnie dopisuje historię wykonanych poleceń do pliku ''**~/.bash_history**'' w momencie wyjścia z powłoki.
\\
Historię (tą z pliku połączoną z bieżącą) można wyświetlić komendą ''**history**''. (W ''man bash_builtins'' znajduje się opis przełączników.)
Do wygodnego przeglądania historii można też użyć programu [[https://dvorka.github.io/hstr/|hstr]]
~~Zadanie.#~~ Jakim skrótem czyści się ekran?
~~Zadanie.#~~ Jakimi skrótami wyszukuje się wstecz w historii?
~~Zadanie.#~~ Jakim skrótem przesuwa się kursor o jedno słowo?
~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów?
~~Zadanie.#~~ Jakim skrótem wstawia się ostatnie słowo z poprzedniego polecenia w historii?
~~Zadanie.#~~ Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii?
~~Zadanie.#~~ Jakim skrótem zamienia się kolejnością to słowo z poprzednim?
===== Edycja plików w konsoli =====
=== vi i vim ===
''vi'' jest często jedynym domyślnie instalowanym edytorem tekstowym.
''vim'' to ulepszona wersja ''vi''.
Żeby nauczyć się ''vim'', uruchom ''vimtutor''.
''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/vi.html|POSIX]].
\\
Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox.
~~Zadanie.#~~ Przejdź całą pierwszą lekcję w ''vimtutor''.
~~Zadanie.#~~ Przejdź pozostałe lekcje w ''vimtutor''.
=== nano ===
Nano jest stosunkowo prostym edytorem tekstowym.
Podstawowe skróty są wyświetlone na dole ekranu.
Więcej na: https://www.nano-editor.org/docs.php
=== Emacs ===
[[https://www.gnu.org/software/emacs/|Emacs]] jest [[https://en.wikipedia.org/wiki/Editor_war|odwiecznym rywalem]] ''vim''a w konkurencji programów do edytowania tekstu w konsoli.
Po wpisaniu ''emacs'' możesz wybrać tutorial skrótem //Ctrl+h t//.
=== Inne ===
* [[https://joe-editor.sourceforge.io/|joe]]
* mcedit – edytor zintegrowany z [[https://en.wikipedia.org/wiki/Midnight_Commander|mc]]
* [[https://micro-editor.github.io/|micro]]
* [[https://neovim.io/|neovim]]
* [[https://helix-editor.com/|hx]]
===== Potoki =====
Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego
wejścia, a piszą do standardowego wyjścia.
Uniksopodobne systemy przez długie lata((Od jakiegoś czasu wiele dystrybucji
opiera się na programach które robią jak najwięcej się da i rozrosły się do tego
stopnia że nikt już do końca nie panuje nad tym co i w jaki sposób robią (jak
np. [[https://en.wikipedia.org/wiki/Systemd|systemd]]).)) trzymały się założenia,
że każdy program ma [[https://en.wikipedia.org/wiki/Unix_philosophy|solidnie wykonywać jedno dobrze określone zadanie]].
\\
Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne
przez takie proste programy.
Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu.
- Wiesz że ''ps -ef'' wypisuje procesy, więc zapisujesz do pliku ich listę: ''ps -ef > ps_output''.
- Potrzebujesz tylko pierwszej kolumny – nazwy użytkownia, \\ Żeby wyciąć tylko pierwszą (oddzielaną spacją) kolumnę, używasz komendy ''cut --delimiter ' ' --field 1 < ps_output > cut_output''.
- Żeby skorzystać z programu który liczy powtarzające się linie, musisz mieć je obok siebie. \\ Więc komendą ''sort < cut_output > sort_output'' sortujesz plik.
- Na końcu korzystasz z komendy ''uniq --count < sort_output'' która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła.
Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ''ps_output'', ''cut_output'' i ''sort_output''.
W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego
programu ze standardowym wejściem innego programu.
\\
Zamiast wykonywać powyższe komendy, można uruchomić
''ps -ef | cut --delimiter ' ' --field 1 | sort | uniq --count''
które robi to samo bez tworzenia żadnych plików na dysku.
\\
Łączenie standardowego wyjścia jednego programu ze standardowym wejściem innego
jest technicznie wykonywane za pomocą specjalnego rodzaju pliku nazwanego
**potokiem** (//pipe//). Powłoka tworzy taki plik (w RAMie), zastępuje
standardowe wyjście jednego programu tym plikiem oraz zastępuje standardowe
wejście drugiego programu tym samym plikiem. Odczyt z potoku blokuje się do
czasu aż pojawią się na nim dane lub aż wszyscy piszący do potoku go nie zamkną.
**Składnia ''//cmd_a// | //cmd_b//'' łączy standardowe wyjście //cmd_a// ze
standardowym wejściem //cmd_b//.** \\
Takie komendy są uruchamiane współbieżnie.
Programy trzymające się "filozofii UNIX'a" czytają z plików o ile podano je w
argumentach __lub ze standardowego wejścia jeśli nie podano plików w argumentach__.
Dodatkowo standardowe wejście jest używane ilekroć ''-'' pojawia się w kontekście
nazwy pliku.
Do wykonania ''//cmd_a// | //cmd_b//'' powłoka tworzy **potok nienazwany**
(anonimowy). \\
Można stworzyć **potok nazwany** używając komendy ''**mkfifo** //nazwa_pliku//''. \\
Dane zapisane do potoków, zarówno nazwanego jak i anonimowego, są przechowywane
w pamięci operacyjnej – nie są zapisywane na dysk. Odczytanie danych z potoku
usuwa je z pamięci.
++++ Przykłady | {{page>so:redirects:pipes1&inline}} ++++
~~Zadanie.#~~ Wykonaj ''echo '2+2*2'''. Potem wynik tego polecenia przekaż przez potok do ''bc''.
~~Zadanie.#~~ Użyj ''echo'' do wyświetlenia jakiegoś teksu. Potem powtórz komendę
przekazując jej wynik w potoku do ''xxd''.
~~Zadanie.#~~ Wypisz listę plików w katalogu domowym.
\\
Powtórz komendę przekazując w potoku jej wyniki do programu ''cat''.
\\
Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do ''cat -n''.
~~Zadanie.#~~ Połącz w potok komendy ''ps -eF'' i ''fold''
~~Zadanie.#~~ Stwórz nazwany potok //p//. Przekieruj wejście programu ''fold''
z //p// w jednym terminalu, a w drugim przekieruj wyjście ''ps -eF'' do //p//.
Powtórz komendy wykonując ''ps'' przed ''fold''.
===== Filtry =====
Nazwą [[https://en.wikipedia.org/wiki/Filter_(software)|filtry]] określa się
zbiorczo programy (w dużej części mające początki jeszcze w systemie UNIX) które
czytają standardowe wejście, przetwarzają je w użyteczny sposób i piszą wynik
do standardowego wyjścia.
==== head, tail ====
''**head**'' i ''**tail**'' wypisują podaną liczbę początkowych / końcowych
linii lub bajtów. Domyślnie oba programy wypisują 10 linii.\\
Przełącznikiem ''-n //liczba//'' / ''-c //liczba//'' określa się liczbę
wypisywanych linii / bajtów.
Jeśli programowi ''head'' poda się numer poprzedzony minusem ('**-**'),
np. ''head -//n// -//10//'', to wypisze //linie// poza ostatnimi //10//. \\
Jeśli programowi ''tail'' poda się numer poprzedzony plusem ('**+**'),
np. ''tail -//n// **+**//10//'', to wypisze //linie// zaczynając od linii nr //10//.
++++ Przykłady | {{page>so:pipes_filters:head_tail&inline}} ++++
~~Zadanie.#~~ Uruchom ''paste <(seq 15) <(seq 15 -1 1)''. Potem przetwórz w
potoku wynik tego polecenia wykorzystując ''head'' i ''tail'' tak, by wyświetlić:
* pierwsze trzy linie
* ostatnie trzy linie
* wszystko poza pierwszymi trzema liniami
* wszystko poza ostatnimi trzema liniami
* linie od 6 do 9
Ważnym przełącznikiem programu ''tail'' jest ''-f'' / ''--follow''. \\
''**tail -f …**'' najpierw wykona swoje normalne działanie, potem będzie na
bieżąco wyświetlać wszystkie dane które będą dopisywane do pliku.
~~Zadanie.#~~ Wykonaj ''seq 25 > //plik//''. Potem uruchom w jednym terminalu
''tail -f //plik//'', a w drugim dopisz (przekierowaniem wyjścia) dane do //plik//u.
==== grep ====
Komenda ''**grep** //regex// [//plik//]...'' wypisuje linie z //plik//ów (lub
standardowego wejścia) które pasują do wyrażenia regularnego //regex//.
Przełącznik ''-r'' / ''-R'' pozwala podać jako //plik// katalog. W takim wypadku
cała jego zawartość będzie przeszukiwana.
\\
Jeśli podano ''-r''/ ''-R'' i nie podano żadnego //plik//u, to rekurencyjnie
przeszukiwany jest bieżący katalog (a nie standardowe wejście).
''grep'' pozwala na wybór jednej z kilku gramatyk wyrażeń regularnych.
POSIX [[https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html|określa]]
dwie: //basic// (domyślną) i //extended// (używaną przez ''egrep'' i ''grep -E'').
Szczegółów szukaj w dokumentacja twojej implementacji komendy ''grep''.
Domyślnie wyrażenia rozróżniają wielkość liter. Aby to zmienić, dodaj opcję ''-i''.
Opcja ''-v'' powoduje wypisywane niepasujących linii.
Przełącznikami programu ''grep'' można wybrać m. inn. czy pokazane mają być
wszystkie pasujące linie, ileś pierwszych pasujących linii bądź tylko nazwa
pliku z pasującymi liniami.
Można też wybrać czy wyniki mają być poprzedzone nazwą pliku i numerem linii
w pliku.
\\
(Jeśli podano wiele plików, nazwa pliku jest domyślnie dodawana; jeśli plik jest
binarny zdaniem ''grep''a, domyślnie wyświetlane jest tylko czy pasuje.)
''grep'' może wyświetlić dodatkowo //N// linii przed (''-B //N//''),
po (''-A //N//'') lub przed i po (''-C //N//'') każdej pasującej linii. \\
Przełączniki są nazwane od __b__efore, __a__fter i __c__ontext
++++ Przykłady | {{page>so:pipes_filters:grep&inline}} ++++
~~Zadanie.#~~ Przefiltruj ''seq 75'' używając ''grep'' tak by wyświetlone były linie:
* zawierające ''5''
* kończące się na ''5''
* kończące się na ''5'' lub ''0''
* zawierające ''33'' wraz z 3 liniami które je poprzedzają
* zawierające ''33'' wraz z 2 liniami kontekstu
~~Zadanie.#~~
Wyświetl linie zawierające ''10'' w plikach ''/etc/passwd'' i ''/etc/group''.
~~Zadanie.#~~
Wylistuj pliki zawierające ''ecdsa'' w katalogu ''~/.ssh''.
==== cut ====
Program ''**cut**'' wyświetla w każdej linii wybrane znaki (''-c //spec//'') /
bajty (''-b //spec//'') / pola (''-f //spec//'').
\\
Pole to dowolna ilość znaków oddzielona jednoznakowym separatorem (''-d //sep//'', domyślnie tab).
Specyfikacja pól/bajtów/… to ''//zakres//[,//zakres//]...'', gdzie każdy zakres
to ''//pozycja//'', lub ''//start//-//koniec//'', lub ''//start//-'', lub ''-//koniec//''.
\\
Dla przykładu, ''echo 123456789abcdef | cut -c -3,6,9-11,14-'' wypisze ''12369abef'' (kolory dodano ręcznie dla lepszego zrozumienia).
++++ Przykłady | {{page>so:pipes_filters:cut&inline}} ++++
~~Zadanie.#~~ Przefiltruj wynik komendy ''mount'' (lub pliku ''/etc/mtab'') tak
by wyciąć piąte (lub trzecie dla pliku ''/etc/mtab'') oddzielane spacjami pole
(które zawiera typ systemu plików).
~~Zadanie.#~~ Usuń z wyniku komendy
''egrep '^[Ee]{2}' /usr/share/myspell/en_US.dic'' ukośnik i wszystko za nim.
==== sort ====
Program **''sort''** domyślnie sortuje linie alfabetycznie (łącznie wszystkich
plików wejściowych lub standardowego wejścia).
Kolejne opcje **''-k''** definiują klucze sortowania.
(Pola są oddzielane białymi znakami i naturalnie numerowane.)
* ''sort -k4'' używa pól 4,5,6,7,8,…
* ''sort -k4,4'' używa tylko pola 4
* ''sort -k4,6'' używa pól 4, 5 i 6
* ''sort -k5,4'' jest nieprawidłowe
* ''sort -k5,5 -k4,4'' używa pól 5 i 4
Klucze sortowania mogą mieć opcje, np. **''-n''** sortuje numerycznie a
**''-r''** odwraca kierunek.
\\
Opcje można ustawić dla wszystkich kluczy naraz bądź dla każdego klucza z osobna:
* ''sort -r -k5,5 -k4,4'' sortuje malejąco zarówno po polu 5 i 4
* ''sort -k5,5r -k4,4'' sortuje malejąco po polu 5 i domyślnie (rosnąco) po polu 4
* ''sort -k5,5 -k4,4r'' sortuje domyślnie (rosnąco) po polu 5 i malejąco po polu 4
Domyślnie sortowanie nie jest stabilne; można zażądać stabilnego sortowania opcją ''-s''.
Informacje o dalszych możliwościach programu ''sort'' znajdziesz w podręczniku.
++++ Przykłady | {{page>so:pipes_filters:sort&inline}} ++++
~~Zadanie.#~~ Stwórz plik wejściowy dla następnych zadań kopiując i wklejając w
powłokę następujące polecenie:
paste \
<(perl -e 'printf "%d\n", rand(10) for(1..20)') \
<(perl -e 'print((K,Q,J)[rand(3)]."\n") for(1..20);') \
<(perl -e 'printf "%d\n", rand(1500) for(1..20)') \
<(perl -e 'my @a=("a","b","c"); print $a[rand(@a)] . $a[rand(@a)] ."\n" for(1..20);') \
<(perl -e 'printf "%d\n", rand(1500) for(1..20)') \
<(perl -e 'my @a=("x","y","z"); print $a[rand(@a)] . $a[rand(@a)] ."\n" for(1..20);') \
<(seq -w 20) \
> random_data
~~Zadanie.#~~ Wyświetl plik ''random_data''. Potem go posortuj (domyślnie).
~~Zadanie.#~~ Posortuj plik ''random_data'' ignorując dwa pierwsze pola. Potem
znów posortuj ten plik ignorując dwa pierwsze pola, ale tym razem numerycznie.
~~Zadanie.#~~ Posortuj plik ''random_data'' używając pól z K/Q/J i pól ze
znakami xyz (w tej kolejności).
~~Zadanie.#~~ Posortuj plik ''random_data'' używając tylko drugiego pola zarówno
bez jak i z opcją '' -s'' (''--stable'').
~~Zadanie.#~~ Posortuj plik ''random_data'' po drugim polu (alfabetycznie)
i trzecim polu (numerycznie).
''**shuf**'' wypisuje linie w losowej kolejności.
~~Zadanie.#~~ Wykonaj ''seq 20 | shuf''.
==== wc, uniq, nl ====
Program **''wc''** (//word count//) liczy linie, słowa i bajty.
\\
Jeśli w argumentach poda mu się wiele plików, wypisuje zarówno informacje o każdym pliku z osobna jak i łączne wyniki.
\\
Przełącznikami ''-l'', ''-w'' i ''-c'' można wybrać liczenie linii, słów i bajtów.
\\
Przełącznik ''-m'' liczy znaki (włączając niedrukowalne).
\\
Liczba bajtów i znaków będzie różna jeśli plik zawiera wielobajtowe znaki, np. ''wc -mc <<< "‡∞♣"'' zliczy 10 bajtów i 4 znaki (trzy widoczne i znak nowej linii).
Program **''uniq''** domyślnie usuwa powtarzające się linie.
Z przełącznikami pozwala też między innymi na:
* ''-c'' — wpisanie przed każdą linię ilości powtórzeń
* ''-d'' — wypisanie tylko powtarzających się linii
* ''-u'' — wypisanie tylko niepowtarzających się linii
''**nl**'' numeruje linie. Pozwala też numerować linie w ustrukturyzowanych plikach tekstowych.
++++ Przykłady | {{page>so:pipes_filters:wc_uniq&inline}} ++++
~~Zadanie.#~~ Przefiltruj ''man wc'' przez ''cat''. Potem przefiltruj ''man wc'' przez ''wc''. Ile słów jest w ''man wc''?
~~Zadanie.#~~ Sprawdź wynik ''wc /etc/motd /etc/SUSE-brand''.
~~Zadanie.#~~ Polecenie ''perl -e 'printf "%d\n", (int rand(6)+1)+(int rand(6)+1) for(1..100)''' rzuca 100 razy 2d6.
\\
Przefiltruj wyniki tego polecenia przez ''uniq'' tak żeby zobaczyć kolejne rzuty z tymi samymi wynikami.
\\
Przefiltruj wyniki tego polecenia przez ''sort'' i ''uniq'' tak żeby zobaczyć ile razy był uzyskany każdy wynik.
==== tac, rev ====
''tac'' wyświetla linie w odwrotnej kolejności (w każdym podanym pliku z osobna).
''rev'' wyświetla znaki w każdej linii w odwrotnej kolejności.
~~Zadanie.#~~ Obejrzyj wynik komendy ''echo -e '1 2 3\n4 5 6\n7 8 9'''.
Potem przefiltruj tą komendę przez ''tac'', następnie przez ''rev''.
==== tr, sed ====
Program ''**tr**'' zamienia lub usuwa podane znaki.
Polecenie ''tr -d //LISTA//'' usunie wszystkie znaki z //LIST//y.
Polecenie ''tr //KTÓRE// //NACO//'' zamienia każdy n-ty znak z listy //KTÓRE//
na n-ty znak z listy //NACO//.
\\
Jeśli //NACO// jest krótsze niż //KTÓRE//, nadmiarowe znaki z //KTÓRE// są
zmieniane na ostatni znak z //NACO//.
Przełącznik ''-s'' powoduje, że (po dokonaniu zwykłej zamiany) ciągi identycznych
znaków //x// z listy //NACO// są zastępowane pojedynczym znakiem //x//.
Np. ''tr -s 123 npn <<< 123_132_13n_ppp'' wypisze ''npn_np_n_p''.
Przełącznik ''-c'' powoduje zamianę znaków których nie ma w liście.
Listy mogą zawierać zakresy znaków (np. ''[0-9]'', ''[a-f]'') i [[https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap07.html#tag_07_03_01|klasy znaków]] (np. ''[:alnum:]'', ''[:space:]'').
Uwaga: ''tr'' nie przyjmuje nazw plików w liście argumentów - potrafi czytać tylko
ze standardowego wejścia.
++++ Przykłady | {{page>so:pipes_filters:tr&inline}} ++++
~~Zadanie.#~~ Przefiltruj wynik komendy ''ls -l'' przez ''tr'' tak, aby:
* zastąpić wszystkie cyfry znakiem ''-'',
* zmienić wszystkie małe litery (z zakresu znaków ASCII) na wielkie,
* zastąpić wszystkie ciągi spacji pojedynczymi spacjami
* usunąć wszystkie litery ''rwx''
Do bardziej złożonego zastępowania tekstu powszechnie używa się programu ''sed''. \\
''**sed**'' (__s__tream __ed__itor) czyta wejście po linii naraz i wykonuje
podany (zwykle w linii poleceń jako argument) skrypt działający na linii
i domyślnie wypisuje ją po jego wykonaniu.
Najprostsza komenda wykonująca znajdź/zastąp to ''sed 's/regexp/replacement/'''.
''sed'' jest kompletne w sensie Turinga. Jeśli starczy czasu w semestrze, ''sed'' będzie omawiany później.
==== awk ====
[[https://en.wikipedia.org/wiki/AWK|awk]] jest językiem stworzonym do przetwarzania
tekstu, również przetwarzającym tekst linia po linii na podstawie podanego skryptu.
W ''awk'' skrypt składa się z reguł – par ''warunek {instrukcje}'', gdzie warunek
określa dopasowanie do linii (bądź początku/końca przetwarzania/pliku). \\
''awk'' nie jest omawiany na zajęciach z SOp; jest omawiany w ramach obieralnego
przedmiotu Języki formalne i kompilatory.
==== more, less ====
Do wyświetlania tekstu nie mieszczącego się w terminalu można użyć jednego
z programów nazywanych zbiorczo //pagerami//.
\\
Pager wyświetla naraz tyle tekstu ile zmieści się w terminalu ("stronę" tekstu)
i pozwala na przejście do kolejnej porcji tekstu (zwykle naciskając właściwy
klawisz, np. //spacja//).
Z większością systemów operacyjnych instalowany jest program **''[[https://pl.wikipedia.org/wiki/More_(polecenie)|more]]''**
będący prostym pagerem.
\\
''more'' jest też częścią standardu POSIX.
Uniksopodobne systemy zwykle są wyposażone w program **''less''** (którego hasło
marketingowe brzmi: //less > more//).
Jeśli zmienna środowiskowa ''$LESSOPEN'' jest ustawiona, ''less'' nie pokazuje
danych bezpośrednio, tylko najpierw przekazuje je do wskazanego przez tą zmienną
polecenia (np. zmieniając poleceniem ''LESSOPEN='|rev %s''' tą
zmienną dla bieżącej powłoki, ''less'' będzie wypisywać w każdej linii znaki w
odwrotnej kolejności).
\\
Takie programy zwykle próbują rozpoznać rodzaj pliku i dla znanych sobie nieczytelnych
dla człowieka typów plików wyświetlają czytelny dla człowieka ekwiwalent zawartości
żądanego pliku.
\\
''[[https://github.com/wofr06/lesspipe|lesspipe]]'' jest wiodącą implementacją tej
funkcji.
''less'' wspiera między innymi przełączniki:
* ''-S'' – nie zawijaj wierszy
* ''-R'' – (sensowne) sekwencje sterujące są wypisywane (domyślnie są usuwane)
* ''-L'' – wyłącza przetwarzanie wejścia przez polecenie wskazane w ''$LESSOPEN''
* ''-N'' – numeruje wiersze
Po uruchomieniu ''less'' można wyświetlić pomoc naciskając ''h''. Wybór przydatnych skrótów:
* //spacja// lub //PgDown// / //PgUp// – idź do następnej / poprzedniej strony
* liczba – skacze do linii o tym numerze
* liczba zakończona //%// – skacze do tej części dokumentu
* //g// / //G// – skacze na początek / koniec dokumentu
* // /wzorzec // / //?wzorzec// — wyszukuje //wzorca// do przodu / do tyłu \\ //n// / //N// – powtarza wyszukiwane w tym samym / odwrotnym kierunku
* //s// – zapisuje dane do pliku (przydatne jeśli less czyta z potoku)
* //v// – otwiera plik do edycji w domyślnym edytorze (wskazanym przez zmienną ''$EDITOR''; dostępne jeśli ''less'' wyświetla plik)
* //F// – czeka na pojawienie się w pliku nowych danych (jak ''tail -f'')
Program ''man'' używa programu ''less'' jako domyślnego pagera.
~~Zadanie.#~~ Wpisz ''man less'' żeby wyświetlić stronę dokumentacji dla ''less''
przy pomocy programu ''less''. Przetestuj powyższe skróty.
~~Zadanie.#~~ Otwórz plik PDF (np. ''/usr/share/doc/packages/apparmor-docs/techdoc.pdf'') używając ''less'', bez opcji oraz z opcją ''-L''. \\
Otwórz archiwum ''tar'' używając ''less'' (np. ''/usr/share/doc/packages/automake/amhello-1.0.tar.gz'').\\
Otwórz katalog (np. ''/usr/include'') używając ''less''.
Program ''**[[https://github.com/sharkdp/bat|bat]]**'', pretendujący do bycia
lepszą wersją programu ''cat'', automatycznie uruchamia pager jeśli dane do
wyświetlenia nie mieszczą się w terminalu.
==== tee ====
Polecenie ''**tee** [-a] //plik//...'' przepisuje dane ze standardowego wejścia
na standardowe wyjście oraz do każdego //plik//ów.
\\
Domyślnie pliki są nadpisywane przez program ''tee''. Przełącznik ''-a''
powoduje że pliki są otwierane w trybie dopisywania.
''tee'' jest często używane do jednoczesnego wyświetlania na ekranie wyniku
długo działającej komendy (dla monitorowania postępu) i zapisywania wyniku do
pliku (do późniejszego przetwarzania).
~~Zadanie.#~~ Wynik ''tree'' przepuść w potoku przez ''tee'' zapisującego do //plik//u.
Potem wyświetl //plik// używając ''less''.
~~META:
language = pl
~~