Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
so:redirects [2023/03/27 11:23] jkonczak [Szczegóły] |
so:redirects [2024/03/19 23:11] jkonczak [Szczegóły] |
||
---|---|---|---|
Linia 69: | Linia 69: | ||
++++ Przykłady | {{page>so:redirects:echo&inline}} ++++ | ++++ Przykłady | {{page>so:redirects:echo&inline}} ++++ | ||
- | ~~Zadanie.#~~ Sprawdź działanie ''echo -e 'foo\n\nbaz' '' \\ oraz ''echo -e '\n\n one \033[A \033[A two \033[B \033[B \n \033[1;31m red \033[0m' '' \\ <small>[[https://en.wikipedia.org/wiki/ANSI_escape_code|Sekwencje sterujące ANSI]] są dobrze opisane [[https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797|tutaj]]</small> | + | ~~Zadanie.#~~ Sprawdź działanie ''echo -e 'foo\n\nbaz' '' \\ oraz ''echo -e '\n\n one \033[A \033[A two \033[B \033[B \n \033[1;31m red \033[0m' '' \\ <small>[[https://en.wikipedia.org/wiki/ANSI_escape_code|Sekwencje sterujące ANSI]] są dobrze opisane [[https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797|tutaj]] oraz w podręczniku systemowym na stronie ''[[https://man7.org/linux/man-pages/man4/console_codes.4.html|console_codes]]''.</small> |
- | ~~Zadanie.#~~ Sprawdź działanie ''printf "|%4.2f|%3s|%-16s|\n|%4.2f|%3s|%-16s|\n" 3,1428 pi obwod/srednica 9,8 g grawitacja'' | + | ~~Zadanie.#~~ Sprawdź działanie ''printf "|%4.2f|%3s|%-16s|\n|%4.2f|%3s|%-16s|\n" 3.1428 pi obwod/srednica 9.8 g grawitacja'' |
Linia 183: | Linia 183: | ||
</small> | </small> | ||
- | === Input redirections === | + | === Przekierowanie wejścia === |
''komenda < nazwa_pliku'' | ''komenda < nazwa_pliku'' | ||
Linia 231: | Linia 231: | ||
| ''<'' | otwiera plik //słowo// do odczytu i zastępuje //deskryptor_pliku// nowo otwartym| | | ''<'' | otwiera plik //słowo// do odczytu i zastępuje //deskryptor_pliku// nowo otwartym| | ||
- | | ''>'' | wyświetla błąd jeśli plik //słowo// istnieje i opcja "noclobber" jest ustawiona ((Opcja "noclobber" jest domyślnie wyłączona; można ją włączyć komendą ''set -C''.)),\\ otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem | | + | | ''>'' | wyświetla błąd jeśli plik //słowo// istnieje i opcja "noclobber" jest ustawiona((Opcja "noclobber" jest domyślnie wyłączona; można ją włączyć komendą ''set -C''.)),\\ otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem | |
| ''>|'' | otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem \\ (niezależnie czy plik //słowo// istnieje) | | | ''>|'' | otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem \\ (niezależnie czy plik //słowo// istnieje) | | ||
| ''>>'' | otwiera plik //słowo// do dopisywania i zastępuje //deskryptor_pliku// nowo otwartym | | | ''>>'' | otwiera plik //słowo// do dopisywania i zastępuje //deskryptor_pliku// nowo otwartym | | ||
| ''<>'' | otwiera plik //słowo// do odczytu i zapisu, oraz zastępuje //deskryptor_pliku// nowo otwartym | | | ''<>'' | otwiera plik //słowo// do odczytu i zapisu, oraz zastępuje //deskryptor_pliku// nowo otwartym | | ||
- | | ''<<'' | 1) tworzy tymczasowy plik \\ 2) czyta linię ze standardowego wejścia\\ 3) jeśli cała linia to dokładnie //słowo//, idź do 6 \\ 4) jeśli w //słowie// nie ma cudzysłowów (pary ''"'' lub <html><code>'</code></html>), wykonuje podstawienia((Np. pod ''$VAR'' podstawia wartość zmiennej ''VAR'', ''`date`'' jest zastąpione wynikiem komendy ''date'' etc.)) w linii \\ 5) pisze linię do pliku tymczasowego \\ 6) otwiera plik tymczasowy do odczytu \\ 7) zastępuje //deskryptor_pliku// nowo otwartym \\ 8) uruchamia komendę | | + | | ''<<'' | 1) tworzy tymczasowy plik \\ 2) czyta linię ze standardowego wejścia\\ 3) jeśli cała linia to dokładnie //słowo//, idź do 7 \\ 4) jeśli //słowo// nie było ujęte w cudzysłowy (pary ''"'' lub <html><code>'</code></html>), wykonuje podstawienia((Np. pod ''$VAR'' podstawia wartość zmiennej ''VAR'', ''`date`'' jest zastąpione wynikiem komendy ''date'' etc.)) w linii \\ 5) pisze linię do pliku tymczasowego \\ 6) wraca do 2 \\ 7) otwiera plik tymczasowy do odczytu \\ 8) zastępuje //deskryptor_pliku// nowo otwartym \\ 9) uruchamia komendę | |
- | | ''<<-''| działa jak ''<<'', ale po kroku 2 dodaje jeszcze krok: \\ 2a) usuwa wszystkie początkowe tabulatory (''\t'') \\ uwaga: spaces nie są usuwane| | + | | ''<<-''| działa jak ''<<'', ale po kroku 2 dodaje jeszcze krok: \\ 2a) usuwa wszystkie początkowe tabulatory (''\t'') \\ uwaga: spacje nie są usuwane| |
| ''<<<''| Uwaga: to jest rozszerzenie powłoki Bash \\ 1) tworzy tymczasowy plik \\ 2) pisze //słowo// do pliku tymczasowego \\ 3) pisze znak nowego wiersza do pliku tymczasowego \\ 4) otwiera plik tymczasowy do odczytu \\ 5) zastępuje //deskryptor_pliku// nowo otwartym \\ 6) uruchamia komendę | | | ''<<<''| Uwaga: to jest rozszerzenie powłoki Bash \\ 1) tworzy tymczasowy plik \\ 2) pisze //słowo// do pliku tymczasowego \\ 3) pisze znak nowego wiersza do pliku tymczasowego \\ 4) otwiera plik tymczasowy do odczytu \\ 5) zastępuje //deskryptor_pliku// nowo otwartym \\ 6) uruchamia komendę | | ||
| ''<&'' | jeśli //słowo// jest deskryptorem pliku //p// otwartym w trybie pozwalającym na odczyt: duplikuje deskryptor //p// tak żeby zarówno //słowo// jak i //deskryptor_pliku// odnosiły się do tego samego \\ jeśli //słowo// jest ''-'': zamyka //deskryptor_pliku// | | | ''<&'' | jeśli //słowo// jest deskryptorem pliku //p// otwartym w trybie pozwalającym na odczyt: duplikuje deskryptor //p// tak żeby zarówno //słowo// jak i //deskryptor_pliku// odnosiły się do tego samego \\ jeśli //słowo// jest ''-'': zamyka //deskryptor_pliku// | | ||
Linia 299: | Linia 299: | ||
* ''cat <(date) <(date) <(date) > >(rev)'' | * ''cat <(date) <(date) <(date) > >(rev)'' | ||
* ''cat <(date) <(date) < <(date) > >(rev)'' | * ''cat <(date) <(date) < <(date) > >(rev)'' | ||
- | | ||
- | ===== Potoki ===== | ||
- | <small>Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego | ||
- | wejścia, a piszą do standardowego wyjścia.</small> | ||
- | Uniksopodobne systemy przez długie lata((Od jakiegoś czasu wiele dystrybucji | + | ~~META: |
- | opiera się na programach które robią jak najwięcej się da i rozrosły się do tego | + | language = pl |
- | 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. | + | |
- | + | ||
- | <small> | + | |
- | 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żðą linię wpisuje ile razy się powtórzyła. | + | |
- | Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ''ps_output'', ''cut_output'' i ''sort_output''. | + | |
- | </small> | + | |
- | + | ||
- | W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego | + | |
- | programu ze standardowym wejściem innego programu. | + | |
- | \\ | + | |
- | <small>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.</small> | + | |
- | \\ | + | |
- | Łą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''. | + | |
- | + | ||
- | ===== 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.) | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | Do wygodnego przeglądania historii można też użyć programu [[https://dvorka.github.io/hstr/|hstr]] | + | |
- | + | ||
- | </small> | + | |
- | + | ||
- | ~~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? | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów? | + | |
- | + | ||
- | ~~Zadanie.#~~ Jakim skrótów 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? | + | |
- | + | ||
- | </small> | + | |
- | + | ||
- | ===== 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''. | + | |
- | + | ||
- | + | ||
- | <small> | + | |
- | + | ||
- | ''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html|POSIX]]. | + | |
- | \\ | + | |
- | Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox. | + | |
- | + | ||
- | </small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Przejdź całą pierwszą lekcję w ''vimtutor''. | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | ~~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]] | + | |
- | + | ||
- | </small> | + |