Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
so:intro [2023/02/27 15:04] jkonczak [Jak dostać się do shella] |
so:intro [2025/04/07 19:59] (aktualna) jkonczak |
||
---|---|---|---|
Linia 24: | Linia 24: | ||
<html><small></html> | <html><small></html> | ||
- | GNU/Linux | + | Linux, dystrybucja Linuksa, GNU/Linux… |
* [[https://www.gnu.org/gnu/gnu.html|GNU]] to zbiór wolnego oprogramowania, które łącznie tworzy system operacyjny uzupełniony o szeroki wybór oprogramowania użytkowego [[https://www.gnu.org/manual/blurbs.html]] | * [[https://www.gnu.org/gnu/gnu.html|GNU]] to zbiór wolnego oprogramowania, które łącznie tworzy system operacyjny uzupełniony o szeroki wybór oprogramowania użytkowego [[https://www.gnu.org/manual/blurbs.html]] | ||
* jądro GNU, [[https://www.gnu.org/software/hurd/|Hurd]], nie jest jeszcze na zadowalającym poziomie (od 30 lat…) | * jądro GNU, [[https://www.gnu.org/software/hurd/|Hurd]], nie jest jeszcze na zadowalającym poziomie (od 30 lat…) | ||
* więc oprogramowanie GNU jest zwykle uruchamiane na kernelu Linux | * więc oprogramowanie GNU jest zwykle uruchamiane na kernelu Linux | ||
* większość dystrybucji Linuksa zawiera dużą ilość oprogramowania nie będącego częścią GNU (i niekoniecznie będącego wolnym bądź otwartym oprogramowaniem) | * większość dystrybucji Linuksa zawiera dużą ilość oprogramowania nie będącego częścią GNU (i niekoniecznie będącego wolnym bądź otwartym oprogramowaniem) | ||
+ | * kilka dystrybucji Linuksa jest w większości oparte na wolnym i/lub otwartoźródłowym oprogramowaniu spoza projektu GNU i dostępnym na licencjach niezwiązanych z GNU | ||
<html></small></html> | <html></small></html> | ||
Linia 58: | Linia 59: | ||
* Apple w swoich systemach (np. MacOS) dostarcza zmodyfikowane narzędzia z BSD [[https://opensource.apple.com/releases/|[1]]] [[https://github.com/apple-oss-distributions/file_cmds|[2]]] [[https://github.com/apple-oss-distributions/text_cmds|[3]]] | * Apple w swoich systemach (np. MacOS) dostarcza zmodyfikowane narzędzia z BSD [[https://opensource.apple.com/releases/|[1]]] [[https://github.com/apple-oss-distributions/file_cmds|[2]]] [[https://github.com/apple-oss-distributions/text_cmds|[3]]] | ||
* Minimalistyczne i wbudowane systemy często używają [[https://www.busybox.net/downloads/BusyBox.html|BusyBox]]a | * Minimalistyczne i wbudowane systemy często używają [[https://www.busybox.net/downloads/BusyBox.html|BusyBox]]a | ||
- | * Android używa [[https://www.landley.net/toybox/|toybox]]a [[https://cs.android.com/android/platform/superproject/+/master:external/toybox/toys/posix/|[4]]] | + | * Android używa [[https://www.landley.net/toybox/|toybox]]a [[https://cs.android.com/android/platform/superproject/main/+/main:external/toybox/toys/posix/|[4]]] |
* Dłuższa lista alternatywnych zestawów jest np. tutaj: [[https://wiki.archlinux.org/title/core_utilities]] | * Dłuższa lista alternatywnych zestawów jest np. tutaj: [[https://wiki.archlinux.org/title/core_utilities]] | ||
<html></small></html> | <html></small></html> | ||
- | POSIX standaryzuje zarówno [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html|powłokę]] | + | POSIX standaryzuje zarówno [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html|powłokę]] |
- | jak i kluczowe [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html|narzędzia]]. | + | jak i kluczowe [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/contents.html|narzędzia]]. |
==== Jak dostać się do shella ==== | ==== Jak dostać się do shella ==== | ||
Linia 77: | Linia 78: | ||
* programy dołączane do środowisk graficznych Linuksa: [[https://docs.xfce.org/apps/terminal/start|xfce4-terminal]], [[https://en.wikipedia.org/wiki/GNOME_Terminal|GNOME Terminal]], [[https://konsole.kde.org/|konsole]] | * programy dołączane do środowisk graficznych Linuksa: [[https://docs.xfce.org/apps/terminal/start|xfce4-terminal]], [[https://en.wikipedia.org/wiki/GNOME_Terminal|GNOME Terminal]], [[https://konsole.kde.org/|konsole]] | ||
* MacOS domyślne używa aplikacji [[https://en.wikipedia.org/wiki/Terminal_(macOS)|Terminal]] | * MacOS domyślne używa aplikacji [[https://en.wikipedia.org/wiki/Terminal_(macOS)|Terminal]] | ||
- | * popularne są też wyjeżdżające z góry terminale przywoływane/chowane prostym skrótem klawiszowym:\\ [[https://apps.kde.org/yakuake/|yakuake]] / [[http://guake-project.org/|guake]] / [[https://github.com/lanoxx/tilda|tilda]] | + | * popularne są też wyjeżdżające z góry terminale przywoływane/chowane prostym skrótem klawiszowym:\\ [[https://apps.kde.org/yakuake/|yakuake]] / [[https://guake.github.io/|guake]] / [[https://github.com/lanoxx/tilda|tilda]] |
<html></small></html> | <html></small></html> | ||
Linia 93: | Linia 94: | ||
Podstawowa komenda do logowania do powłoki na zdalnym systemie to: | Podstawowa komenda do logowania do powłoki na zdalnym systemie to: | ||
\\ | \\ | ||
- | ''ssh //użytkownik//@//host//'' | + | **''ssh //użytkownik//@//host//''** |
\\ | \\ | ||
gdzie ''użytkownik'' to nazwa użytkownika, a ''host'' to nazwa bądź adres docelowego urządzenia. | gdzie ''użytkownik'' to nazwa użytkownika, a ''host'' to nazwa bądź adres docelowego urządzenia. | ||
\\ | \\ | ||
- | Na przykład, gdyby użytkownik ''piotr'' chciał zalogować się na komputer o nazwie ''polluks.put.poznan.pl'', musiałby wpisać: \\ ''ssh piotr@polluks.put.poznan.pl''. | + | Na przykład, gdyby użytkownik ''piotr'' chciał zalogować się na komputer o nazwie ''polluks.cs.put.poznan.pl'', musiałby wpisać: \\ ''ssh piotr@polluks.cs.put.poznan.pl''. |
W tej chwili wszystkie istotne systemy operacyjne (włącznie z Windows) mają domyślnie zainstalowaną komendę ''ssh''. | W tej chwili wszystkie istotne systemy operacyjne (włącznie z Windows) mają domyślnie zainstalowaną komendę ''ssh''. | ||
- | <html><small></html> | + | <small> |
SSH (Secure SHell) szyfruje cały ruch. Poprzednik SSH – telnet – wszystko, włącznie z hasłami, wysłał czystym tekstem. | SSH (Secure SHell) szyfruje cały ruch. Poprzednik SSH – telnet – wszystko, włącznie z hasłami, wysłał czystym tekstem. | ||
- | <html></small></html> | + | Przy uwierzytelnianiu hasłem, klient musi wysłać do serwera swoje hasło. |
+ | \\ | ||
+ | Krytyczne dla bezpieczeństwa jest sprawdzenie przez klienta że faktycznie | ||
+ | komunikuje się z docelowym serwerem, a nie z podszywającym się pod niego | ||
+ | serwerem który, odpowiednio spreparowany, pozwoli wykraść hasło | ||
+ | ([[https://docs.ssh-mitm.at/user_guide/authentication.html#id2|gotowe narzędzie]]) | ||
+ | i/lub przechwycić sesję. | ||
+ | \\ | ||
+ | Do sprawdzania tożsamości serwera używa się [[https://pl.wikipedia.org/wiki/Kryptografia_klucza_publicznego|kryptografii asymetrycznej]]: | ||
+ | serwer ma swój (tajny) klucz prywatny i na początku każdego połączenia wysyła | ||
+ | klientowi klucz publiczny, a klient weryfikuje czy klucz wysłany przez serwer | ||
+ | odpowiadający posiadanemu kluczowi prywatnemu. | ||
+ | \\ | ||
+ | Dlatego klient SSH przy pierwszym połączeniu do każdego serwera prosi | ||
+ | użytkownika o sprawdzenie klucza, następnie dopisuje go do bazy kluczy | ||
+ | (w OpenSSH trzymanej w pliku ''~/.ssh/known_hosts'') | ||
+ | i sprawdza przy każdym kolejnym połączeniu. | ||
+ | |||
+ | </small> | ||
~~Zadanie.#~~ Uruchom emulator terminala. Wykonaj komendy ''date'' i ''echo $SHELL''. | ~~Zadanie.#~~ Uruchom emulator terminala. Wykonaj komendy ''date'' i ''echo $SHELL''. | ||
Linia 115: | Linia 134: | ||
~~Zadanie.#~~ Używając SSH i swojego konta zaloguj się na ''polluks.cs.put.poznan.pl''. | ~~Zadanie.#~~ Używając SSH i swojego konta zaloguj się na ''polluks.cs.put.poznan.pl''. | ||
+ | === Jak zakończyć pracę z powłoką === | ||
+ | |||
+ | Komenda ''exit'' kończy pracę bieżącej powłoki. \\ | ||
+ | Podobnie działa zasygnalizowanie końca pliku (wciśnięcie //Ctrl//+//d//) w pustej linii. | ||
===== Korzystanie z pomocy ===== | ===== Korzystanie z pomocy ===== | ||
==== Podręcznik systemowy i przełącznik 'help' ==== | ==== Podręcznik systemowy i przełącznik 'help' ==== | ||
- | Większość programów wyświetli pomoc jeśli w po nazwie programu jako argument poda się ''--help''. Niektóre programy obsługują też ''-h''. | + | Większość programów wyświetli pomoc jeśli w po nazwie programu jako argument poda się **''--help''**. Niektóre programy obsługują też ''-h''. |
~~Zadanie.#~~ Wyświetl pomoc dla komend ''cat'' i ''bat'' dodając przełącznik 'help'. <html><small></html>(NB: ''bat'' nie jest domyślnie instalowany w wielu dystrybucjach.)<html></small></html> | ~~Zadanie.#~~ Wyświetl pomoc dla komend ''cat'' i ''bat'' dodając przełącznik 'help'. <html><small></html>(NB: ''bat'' nie jest domyślnie instalowany w wielu dystrybucjach.)<html></small></html> | ||
- | Razem z programem zwykle dostarczane są strony podręcznika systemowego (and. system MANual). Strony wyświetla się komendą ''man //nazwa_strony//''. | + | Razem z programem zwykle dostarczane są strony podręcznika systemowego (and. system MANual). Strony wyświetla się komendą **''man //nazwa_strony//''**. Do wyjścia z pomocy użyj klawisza ''q''. |
~~Zadanie.#~~ Wyświetl stronę podręcznika dla komendy ''timeout''. | ~~Zadanie.#~~ Wyświetl stronę podręcznika dla komendy ''timeout''. | ||
Linia 132: | Linia 155: | ||
Nazwy muszą być unikalne w ramach sekcji, ale mogę się powtarzać w różnych sekcjach. | Nazwy muszą być unikalne w ramach sekcji, ale mogę się powtarzać w różnych sekcjach. | ||
\\ | \\ | ||
- | Komenda ''whatis //nazwa_strony//'' pokaże listę sekcji w których znajduje się strona o nazwie ''nazwa_strony'' i wyświetli tytuł każdej z takich stron. | + | Komenda **''whatis //nazwa_strony//''** pokaże listę sekcji w których znajduje się strona o nazwie ''nazwa_strony'' i wyświetli tytuł każdej z takich stron. |
~~Zadanie.#~~ Wyświetl listę wszystkich stron o tytule ''time''. | ~~Zadanie.#~~ Wyświetl listę wszystkich stron o tytule ''time''. | ||
Linia 141: | Linia 164: | ||
Do ostatecznego wyświetlania stron program ''man'' używa innego programy – ''less''. Szczegóły ''less'' będą omawiane później.\\ | Do ostatecznego wyświetlania stron program ''man'' używa innego programy – ''less''. Szczegóły ''less'' będą omawiane później.\\ | ||
- | Aby wyszukać tekst w ''less'' należy wpisać ''/'', szukany tekst i wcisnąć //Enter//. aby przejść do kolejnego / poprzedniego wystąpienia należy wpisać odpowiednio ''n'' / ''N''. Z kolei ''g'' przeniesie na początek dokumentu, a ''h'' wyświetli pomoc dla nawigacji w ''less''. | + | Aby wyszukać tekst w ''less'' należy wpisać **''/''**, szukany tekst i wcisnąć //Enter//. aby przejść do kolejnego / poprzedniego wystąpienia należy wpisać odpowiednio **''n''** / ''N''. Z kolei ''g'' przeniesie na początek dokumentu, a ''h'' wyświetli pomoc dla nawigacji w ''less''. |
~~Zadanie.#~~ Wyświetl stronę podręcznika dla ''bash'' i wyszukaj w niej ''printf''. Potem znajdź na tej stronie dokumentację komendy ''dirs''. | ~~Zadanie.#~~ Wyświetl stronę podręcznika dla ''bash'' i wyszukaj w niej ''printf''. Potem znajdź na tej stronie dokumentację komendy ''dirs''. | ||
Linia 168: | Linia 191: | ||
Opcje są zwykle zdefiniowane w krótkiej formie ''-o'' gdzie ''o'' to pojedynczy znak bądź długiej ''--opcja'' gdzie ''opcja'' to nazwa opcji. | Opcje są zwykle zdefiniowane w krótkiej formie ''-o'' gdzie ''o'' to pojedynczy znak bądź długiej ''--opcja'' gdzie ''opcja'' to nazwa opcji. | ||
\\ | \\ | ||
- | <html><small></html>Nieliczne programy używają tylko długich opcji poprzedzonych pojedynczym ''-'' (np. ''find'', ''convert'', ''ffmpeg'').<html></small></html> | + | <html><small></html>Nieliczne programy używają tylko długich opcji poprzedzonych pojedynczym ''-'' (np. ''find'', ''magick'', ''ffmpeg'').<html></small></html> |
\\ | \\ | ||
Krótkie opcje można łączyć w następujący sposób: ''ls -color'' jest równoważne ''ls -c -o -l -o -r'' (i różne od ''ls --color'') | Krótkie opcje można łączyć w następujący sposób: ''ls -color'' jest równoważne ''ls -c -o -l -o -r'' (i różne od ''ls --color'') | ||
Linia 178: | Linia 201: | ||
Dla przykładu, we wzorcu komendy ''find -amin N'' i ''find -anewer FILE'' wyrażenia ''N'' i ''FILE'' są wypełniaczami: ''N'' musi być zastąpione liczbą minut, a ''FILE'' nazwą pliku. | Dla przykładu, we wzorcu komendy ''find -amin N'' i ''find -anewer FILE'' wyrażenia ''N'' i ''FILE'' są wypełniaczami: ''N'' musi być zastąpione liczbą minut, a ''FILE'' nazwą pliku. | ||
- | ~~Zadanie.#~~ Wykonaj: \\ ''man zip'' i przejrzyj SYNOPSIS, \\ ''more --help'' i wyjaśnij składnię \\ ''taskset -h'' i wyjaśnij składnię | + | ~~Zadanie.#~~ Wykonaj: \\ ''man zip'' i przejrzyj SYNOPSIS, \\ ''findmnt --help'' i wyjaśnij składnię \\ ''taskset -h'' i wyjaśnij składnię |
==== Autouzupełnianie ==== | ==== Autouzupełnianie ==== | ||
- | Praktycznie każda powłoka wspiera autouzupełnianie. Wywołuje się je wciskając klawisz //TAB//.\\ | + | Praktycznie każda powłoka wspiera autouzupełnianie. Wywołuje się je wciskając klawisz **//TAB//**.\\ |
Autouzupełnianie ma dokończyć wpisywanie słowa na którego końcu stoi kursor i robi to, o ile jest tylko jedno możliwe pasujące dokończenie.\\ | Autouzupełnianie ma dokończyć wpisywanie słowa na którego końcu stoi kursor i robi to, o ile jest tylko jedno możliwe pasujące dokończenie.\\ | ||
Jeśli autouzupełnianie zna wiele możliwości, to nic nie wpisze. Po ponownym wciśnięciu klawisza //TAB// większość mechanizmów autouzupełniania wyświetli wszystkie możliwości. | Jeśli autouzupełnianie zna wiele możliwości, to nic nie wpisze. Po ponownym wciśnięciu klawisza //TAB// większość mechanizmów autouzupełniania wyświetli wszystkie możliwości. | ||
Linia 188: | Linia 211: | ||
Implementacja autouzupełniania różni się w zależności od powłoki. Wiele powłok wspiera skrypty pomocnicze zależne od kontekstu. | Implementacja autouzupełniania różni się w zależności od powłoki. Wiele powłok wspiera skrypty pomocnicze zależne od kontekstu. | ||
- | ~~Zadanie.#~~ Wpisz ''bad'' i naciśnij //TAB//. Wpisz ''ba'' i naciśnij //TAB// dwukrotnie. | + | ~~Zadanie.#~~ Wpisz ''gun'' i naciśnij //TAB//. Wpisz ''ba'' i naciśnij //TAB// dwukrotnie. |
~~Zadanie.#~~ Wpisz ''man --'' i naciśnij //TAB// dwukrotnie. Wpisz ''man fs'' i naciśnij //TAB// dwukrotnie. | ~~Zadanie.#~~ Wpisz ''man --'' i naciśnij //TAB// dwukrotnie. Wpisz ''man fs'' i naciśnij //TAB// dwukrotnie. | ||
Linia 197: | Linia 220: | ||
W systemach uniksopodobnych wszystkie pliki zorganizowane są w strukturę drzewiastą, tzn. każde dwa pliki mają wspólny katalog najwyższego poziomu nazywany po angielsku //[[https://en.wikipedia.org/wiki/Root_directory|root directory]]//. | W systemach uniksopodobnych wszystkie pliki zorganizowane są w strukturę drzewiastą, tzn. każde dwa pliki mają wspólny katalog najwyższego poziomu nazywany po angielsku //[[https://en.wikipedia.org/wiki/Root_directory|root directory]]//. | ||
- | Root directory ma ścieżkę ''/''. \\ | + | Root directory ma ścieżkę **''/''**. \\ |
Inne systemy plików (e.g., pozostałe partitycje, płyty CD, pendrive'y), są //montowane// w wybranym katalogu w istniejącej hierarchii (zamiast tworzyć nową). | Inne systemy plików (e.g., pozostałe partitycje, płyty CD, pendrive'y), są //montowane// w wybranym katalogu w istniejącej hierarchii (zamiast tworzyć nową). | ||
Ścieżka jest łańcuchem nazw oddzielonych przez ''/''. \\ | Ścieżka jest łańcuchem nazw oddzielonych przez ''/''. \\ | ||
- | ''.'' oznacza bieżący katalog, a ''..'' katalog nadrzędny. | + | **''.''** oznacza bieżący katalog, a **''..''** katalog nadrzędny. |
Ścieżka zaczynająca się od ''/'' nazywana jest bezwzględną. Każda inna ścieżka nazywana jest względną. | Ścieżka zaczynająca się od ''/'' nazywana jest bezwzględną. Każda inna ścieżka nazywana jest względną. | ||
Linia 207: | Linia 230: | ||
Uniksopodobne systemy operacyjne dla każdego programu pamiętają katalog roboczy (//working directory//). Ścieżki względne rozwiązywane są zaczynając od katalogu roboczego. | Uniksopodobne systemy operacyjne dla każdego programu pamiętają katalog roboczy (//working directory//). Ścieżki względne rozwiązywane są zaczynając od katalogu roboczego. | ||
- | Każdy użytkownik ma swój [[https://en.wikipedia.org/wiki/Home_directory|katalog domowy]]. Powłoka (i niektóre inne programy) zastępuje każde słowo ''~'' przez ścieżkę bieżącego użytkownika. <html><small></html>''~user'' określa katalog domowy użytkownika ''user'', więc ''~/x/a.txt'' jest plikiem wewnątrz katalogu domowego bieżącego użytkownika, a ''~x/b.txt'' znajduje się w katalogu domowym użytkownika ''x''.<html></small></html> | + | Każdy użytkownik ma swój [[https://en.wikipedia.org/wiki/Home_directory|katalog domowy]]. Powłoka (i niektóre inne programy) zastępuje każde słowo **''~''** przez ścieżkę bieżącego użytkownika. <html><small></html>''~user'' określa katalog domowy użytkownika ''user'', więc ''~/x/a.txt'' jest plikiem wewnątrz katalogu domowego bieżącego użytkownika, a ''~x/b.txt'' znajduje się w katalogu domowym użytkownika ''x''.<html></small></html> |
==== Wyświetlanie zawartości katalogu ==== | ==== Wyświetlanie zawartości katalogu ==== | ||
- | Plecenie ''ls [//katalog//]'' wyświetla listę plików w katalogu ''katalog''. \\ Bez podania argumentów ''ls'' wyświetli bieżący katalog. | + | Polecenie ''**ls [//katalog//]**'' wyświetla listę plików w katalogu ''katalog''. \\ Bez podania argumentów ''ls'' wyświetli bieżący katalog. |
\\ | \\ | ||
- | Domyślnie ''ls'' nie wyświetla ukrytych plików. Przełącznik ''-a'' i ''--all'' zmieniają to zachowanie. | + | Domyślnie ''ls'' nie wyświetla ukrytych plików. Przełącznik **''-a''** zmienia to zachowanie. |
\\ | \\ | ||
- | Przełącznik ''-l'' / ''--list'' wyświetla szczegółową listę plików zawierającą m. inn. dla każdego pliku jego właściciela, rozmiar i datę modyfikacji. | + | Przełącznik **''-l''** wyświetla szczegółową listę plików zawierającą m. inn. dla każdego pliku jego właściciela, rozmiar i datę modyfikacji. |
~~Zadanie.#~~ Wyświetl pliki w ''/usr/share/zoneinfo/'' i ''../../../../../bin''. | ~~Zadanie.#~~ Wyświetl pliki w ''/usr/share/zoneinfo/'' i ''../../../../../bin''. | ||
Linia 236: | Linia 259: | ||
==== Zmiana katalogu roboczego ==== | ==== Zmiana katalogu roboczego ==== | ||
- | Aby wyświetlić katalog roboczy można użyć polecenia ''pwd'' (print working directory). | + | Aby wyświetlić katalog roboczy można użyć polecenia **''pwd''** (print working directory). |
~~Zadanie.#~~ Sprawdź w jakim katalogu znajdujesz się po zalogowaniu do systemu. | ~~Zadanie.#~~ Sprawdź w jakim katalogu znajdujesz się po zalogowaniu do systemu. | ||
- | Aby zmienić katalog roboczy można użyć komendy ''cd [//cel//]'' (change directory). | + | Aby zmienić katalog roboczy można użyć komendy **''cd [//cel//]''** (change directory). |
\\ | \\ | ||
Bez podania celu ''cd'' przejdzie do katalogu domowego. | Bez podania celu ''cd'' przejdzie do katalogu domowego. | ||
Linia 259: | Linia 282: | ||
<html></small></html> | <html></small></html> | ||
+ | |||
+ | ==== Wildcard, regex, … ==== | ||
+ | <small> | ||
+ | |||
+ | W informatyce wykorzystuje się wyrażenia opisujące oczekiwany wynik, do których | ||
+ | następnie mogą być dopasowane dane. | ||
+ | \\ | ||
+ | Przykładowo //linie, które zaczynają się od słowa, po których następuje znak | ||
+ | równości// można zwykle zapisać wyrażeniem regularnym ''^\w+=''. | ||
+ | \\ | ||
+ | (Takiego wyrażenia można użyć zarówno do wybrania pasujących linii z pliku jak | ||
+ | i sprawdzenia czy podana linia pasuje.) | ||
+ | |||
+ | Istnieje wiele pomysłów jak mają wyglądać i działać takie wyrażenia. | ||
+ | |||
+ | W powłoce najczęściej wykorzystuje się | ||
+ | //[[https://pl.wikipedia.org/wiki/Wieloznacznik|wildcard]]//y | ||
+ | i [[https://en.wikipedia.org/wiki/Regular_expression|wyrażenia regularne]]. \\ | ||
+ | |||
+ | Składnia i implementacja zarówno wildcardów jak i wyrażeń regularnych różni się | ||
+ | między aplikacjami / językami programowania. | ||
+ | \\ | ||
+ | W powłoce używa się składni opisanej m. inn. w podręczniku systemowym: | ||
+ | ''[[https://man7.org/linux/man-pages/man7/glob.7.html|man 7 glob]]'', | ||
+ | ''[[https://man7.org/linux/man-pages/man7/regex.7.html|man 7 regex]]'' | ||
+ | |||
+ | </small> | ||
==== Dopasowywanie nazw plików ==== | ==== Dopasowywanie nazw plików ==== | ||
- | Przetwarzając tekst wpisany przez użytkownika powłoka próbuje zastąpić każde słowo zawierające znaki ''*'', ''?'' lub wyrażenia w kwadratowych nawiasach ''[…]''. Każde słowo zawierający takie znaki jest nazywane [[https://en.wikipedia.org/wiki/Glob_(programming)|glob]]em. | + | Przetwarzając tekst wpisany przez użytkownika powłoka próbuje zastąpić nazwami pasujących plików każde słowo zawierające znaki **''*''**, **''?''** lub wyrażenia w kwadratowych nawiasach **''[…]''**. Każde słowo zawierający takie znaki jest nazywane [[https://en.wikipedia.org/wiki/Glob_(programming)|glob]]em. |
- | ''*'' rozwija się do dowolnego tekstu , ''?'' rozwija się do dowolnego znaku, ''[ace]'' rozwija się do ''a'', ''c'', lub ''e'', natomiast ''[f-h]'' do ''f'', ''g'', lub ''h''. | + | ''*'' rozwija się do dowolnego tekstu \\ |
+ | ''?'' rozwija się do dowolnego znaku \\ | ||
+ | ''[ace]'' rozwija się do ''a'', ''c'', lub ''e'' \\ | ||
+ | ''[f-h]'' do ''f'', ''g'', lub ''h'' | ||
Jeżeli istnieje co najmniej jeden plik pasujący do globa, to powłoka zastępuje glob wszystkimi pasującymi nazwami plików. Jeżeli żaden plik nie pasuje, to glob pozostaje niezmieniony. | Jeżeli istnieje co najmniej jeden plik pasujący do globa, to powłoka zastępuje glob wszystkimi pasującymi nazwami plików. Jeżeli żaden plik nie pasuje, to glob pozostaje niezmieniony. | ||
Linia 270: | Linia 323: | ||
~~Zadanie.#~~ Przejdź do katalogu ''/usr/bin/''. Wypisz pliki kończące się na ''cat''. | ~~Zadanie.#~~ Przejdź do katalogu ''/usr/bin/''. Wypisz pliki kończące się na ''cat''. | ||
- | ~~Zadanie.#~~ Wypisz pliki kończące się na ''cat'' będąc w swoim katalogu domowym. | + | ~~Zadanie.#~~ Wypisz pliki z katalogu ''/usr/bin/'' kończące się na ''cat'' będąc w swoim katalogu domowym. |
~~Zadanie.#~~ Wypisz pliki znajdujące się w ''/usr/bin/'' i mające dwuznakową nazwę. | ~~Zadanie.#~~ Wypisz pliki znajdujące się w ''/usr/bin/'' i mające dwuznakową nazwę. | ||
Linia 287: | Linia 340: | ||
<html></small></html> | <html></small></html> | ||
- | |||
- | |||
- | ==== Kopiowanie, przenoszenie, i usuwanie plików ==== | ||
- | |||
- | <html><small></html> | ||
- | |||
- | Do utworzenia pustego pliku możesz użyć ''touch //plik//''. \\ Aby utworzyć plik z zawartością, możesz użyć ''echo //zawartość// > //plik//''. \\ Polecenia ''touch'' i ''echo'', jak również znaczenie ''>'' zostaną omówione później. | ||
- | |||
- | Aby wyświetlić plik, użyj ''cat //plik//''. | ||
- | <html></small></html> | ||
- | |||
- | === Katalogi === | ||
- | |||
- | ''mkdir //dir//'' tworzy nowy katalog. | ||
- | \\ | ||
- | <html><small></html> | ||
- | ''mkdir -p //dir1/dir2/dir3//'' tworzy katalog ''dir1'', i katalog ''dir2'' w ''dir1'', i katalog ''dir3'' w ''dir1/dir2''. | ||
- | Podając przełącznik ''-p'' polecenie ''mkdir'' nie wyświetla błędu jeśli katalog już istnieje. | ||
- | <html></small></html> | ||
- | |||
- | Do usunięcia pustego katalogu można użyć ''rmdir //dir//''. | ||
- | |||
- | ~~Zadanie.#~~ Stwórz następujące drzewo katalogów: | ||
- | . | ||
- | ├── foo | ||
- | │ ├── baz | ||
- | │ │ └── bar | ||
- | │ └── bar | ||
- | └── foobaz | ||
- | └── bar | ||
- | |||
- | ~~Zadanie.#~~ Usuń katalog ''foo/baz''. | ||
- | |||
- | === Twarde i symboliczne dowiązania === | ||
- | |||
- | Wiele wpisów w katalogach może wskazywać na ten sam plik. Nazywa się to [[https://en.wikipedia.org/wiki/Hard_link|twardym dowiązaniem]] (//hard link//). \\ | ||
- | Wpis w katalogu może również wskazywać na inny wpis w katalogu. Nazywa się to [[https://en.wikipedia.org/wiki/Symbolic_link|dowiązaniem symbolicznym]] (//soft link// / //symbolic link//, zwykle skracane do //symlink//). | ||
- | |||
- | Wszystkie Linuksowe systemy [[https://en.wikipedia.org/wiki/Comparison_of_file_systems#File_capabilities|obsługują]] dowiązania twarde do zwykłych plików i symlinki do dowolnych ścieżek (np. pliku lub katalogu). | ||
- | |||
- | Aby utworzyć twarde łącze, można użyć ''ln //źródło// //cel//''. | ||
- | \\ | ||
- | Aby utworzyć symlink, można użyć ''ln -s //źródło// //cel//''. | ||
- | |||
- | ~~Zadanie.#~~ Stwórz plik ''plik1'' z zawartością. Stwórz twarde dowiązanie do pliku ''plik1'' o nazwie ''plik2''. Zmodyfikuj ''plik2''. Wyświetl ''plik1''. | ||
- | |||
- | <html><small></html> | ||
- | |||
- | ~~Zadanie.#~~ Komenda ''ls'' może wyświetlić ilość twardych dowiązań. Sprawdź gdzie ta informacja jest wyświetlana. | ||
- | |||
- | Miejsce na dysku wykorzystywane przez plik wraca do puli wolnej przestrzeni gdy liczba dowiązań spadnie do 0 (wszystkie wpisy w katalogach, które wskazują na plik są usunięte) i plik nie jest już otwarty w żadnym procesie. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | |||
- | ~~Zadanie.#~~ Utwórz w swoim katalogu domowym symlink o nazwie ''TMP'' wskazujący na ''/tmp''. Zmień katalog na ''TMP''. Co wypisuje ''pwd''? | ||
- | |||
- | ~~Zadanie.#~~ Utwórz w swoim katalogu domowym symlink o nazwie ''loop'' wskazujący na twój katalog domowy. Wejdź do ''loop''. I wejdź jeszcze raz do ''loop''. | ||
- | |||
- | ~~Zadanie.#~~ Utwórz symlink do nieistniejącej ścieżki. Wyświetl zawartość katalogu w którym jest ten symlink. | ||
- | |||
- | <html><small></html> | ||
- | |||
- | Polecenie ''readlink [-f] //cel//'' rozwiązuje wszystkie symlinki i wyświetla [[https://en.wikipedia.org/wiki/Canonicalization|kanoniczną]] postać ścieżki. | ||
- | |||
- | System plików Windows NTFS też obsługuje dowiązania. Tworzenie ich jest możliwe np. poleceniem [[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/mklink|mklink]]. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | === Kopiowanie i przenoszenie plików === | ||
- | |||
- | Pliki można kopiować komendą ''cp'' i przenosić (bądź zmieniać nazwę) komendą ''mv'' (nazwy pochodzą odpowiednio od słów //copy// i //move//). | ||
- | |||
- | Podstawowa składnia to ''cp/mv //źródło//… //cel//''. \\ | ||
- | Można podać wiele plików źródłowych jeżeli cel jest katalogiem. \\ | ||
- | Jeśli cel jest plikiem, to zostanie bez ostrzeżenia nadpisany <html><small></html>(o ile nie zostanie użyty przełącznik ''-i'' bądź ''-n'')<html></small></html>. | ||
- | |||
- | <html><small></html> | ||
- | |||
- | Domyślnie ''cp'' odmówi kopiowania katalogu. Przełącznik ''-r'' pozwoli skopiować rekurencyjnie katalog z zawartością. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | ''cp'' kopiując plik tworzy nowy plik z aktualną datą, domyślnymi uprawnieniami itp. | ||
- | \\ | ||
- | Aby skopiować rekursywnie, zachować daty, uprawnienia i inne, można użyć przełącznika ''-a'' (''--archive''). | ||
- | |||
- | <html><small></html> | ||
- | |||
- | Z przełącznikiem ''-l'' program ''cp'' tworzy twarde dowiązania zamiast kopiować pliki. Można to połączyć z ''--recursive''. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | ~~Zadanie.#~~ Skopuj jednym poleceniem pliki ''/etc/os-release'' i ''/etc/SUSE-brand'' do bieżącego katalogu. | ||
- | |||
- | ~~Zadanie.#~~ Wykonaj ''mkdir someDir && for F in plik{1..3}; do echo $RANDOM$RANDOM > someDir/$F; done'' które stworzy katalog ''someDir'' z trzema plikami w środku. | ||
- | |||
- | ~~Zadanie.#~~ Skopiuj rekurencyjnie ''someDir'' i zawartość. | ||
- | |||
- | ~~Zadanie.#~~ Przenieś nowo utworzony katalog do środka katalogu ''someDir''. | ||
- | |||
- | ~~Zadanie.#~~ Zmień nazwę katalogu ''someDir'' na inną. | ||
- | |||
- | <html><small></html> | ||
- | |||
- | ~~Zadanie.#~~ Skopiuj nowo nazwany katalog podając przełączniki ''-al''. Zmień wybrany plik w którymkolwiek z katalogów. Treść których plików uległa zmianie? <html><small></html> (Wyświetl je ''cat //nazwa_pliku//'' lub wyświetl daty modyfikacji plików z dokładnością do sekundy przez \\ ''ls -l --time-style=+%H:%M:%S …'' lub ''tree -D --timefmt=%H:%M:%S …'')<html></small></html> | ||
- | |||
- | <html></small></html> | ||
- | |||
- | === Kopiowanie plików do/z maszyny zdalnej === | ||
- | |||
- | Za pomocą SSH można kopiować pliki. Jeśli ktoś ma dostęp do SSH na zdalnej maszynie, to może kopiować pliki komendą ''scp''.\\ | ||
- | ''scp'' rozumie ''//nazwa//'' jako ścieżkę do lokalnego pliku i ''//użytkownik//@//host//://nazwa//'' jako ścieżkę do pliku na zdalnej maszynie. Zdalne względne ścieżki są rozwiązywane względem katalogu domowego.\\ | ||
- | ''scp'' przyjmuje przełącznik ''-r'' do rekursywnego kopiowania katalogów. | ||
- | |||
- | <html><small></html> | ||
- | |||
- | MS Windows ma domyślnie komendę ''scp'', ale zwykle wygodniej jest korzystać z [[https://en.wikipedia.org/wiki/Comparison_of_FTP_client_software#Protocol_support|menadżerów plików]] wspierających SSH. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | Większość serwerów SSH wspiera też protokół SFTP, pozwalający na wygodniejsze kopiowanie plików.\\ | ||
- | ''sftp //użytkownik//@//host//'' uruchamia linię poleceń ''sftp''. Działają w niej ''ls'' i ''cd'' do nawigowania po zdalnych plikach oraz ''get'' i ''put'' do przenoszenia plików. ''help'' pokaże wszystkie wspierane komendy. | ||
- | |||
- | ~~Zadanie.#~~ Stwórz plik w katalogu ''/tmp'' swojego komputera. Skopiuj go do katalogu domowego użytkownika ''student'' na innym komputerze. | ||
- | |||
- | ~~Zadanie.#~~ Skopiuj ten plik do katalogu ''/tmp'' innego komputera. | ||
- | |||
- | ~~Zadanie.#~~ Skopiuj ten plik do katalogu ''/tmp'' innego komputera używając ''sftp''. | ||
- | |||
- | <html><small></html> | ||
- | === Rsync === | ||
- | |||
- | Program ''[[https://en.wikipedia.org/wiki/Rsync|rsync]]'' jest powszechnie używany do kopiowania plików i katalogów. Wydajnie porównuje pliki źródłowe z docelowymi i kopiuje tylko różnice. Może kopiować dane do/z zdalnych urządzeń, a także może kompresować dane przesyłane przez sieć dla zwiększenia przepustowości. ''rsync'' jest też powszechnie używany do tworzenia kopii zapasowych. | ||
- | |||
- | <html></small></html> | ||
- | |||
- | === Usuwanie plików === | ||
- | |||
- | Program usuwający pliki nazywa się ''rm'' (or remove). | ||
- | |||
- | ''rm'' domyślnie nie usunie katalogów (niezależnie czy są puste) ani plików chronionych przed zapisem. | ||
- | |||
- | Aby usunąć katalog poleceniem ''rm'' (wraz z całą zawartością) trzeba dodać przełącznik ''-r''. | ||
- | |||
- | Aby usunąć plików zabezpieczony przed zapisem (i nie wyświetlać ostrzeżenia jeśli plik który nakazano usunąć nie istnieje) można użyć przełącznika ''-f'' (''--force''). | ||
- | |||
- | Przypadkowo bądź nieprawidłowo użyte ''rm -rf …'' jest częstą przyczyną utraty danych. Szczególnie uważaj na wszystkie ''*'' i to do czego się rozwiną. | ||
- | |||
- | ''rm'' przyjmuje przełączniki ''-I'' i ''-i'' które proszą o potwierdzenie usunięcia plików. ''-I'' pyta raz przed rozpoczęciem usuwania wielu plików, a ''-i'' pyta przed usunięciem każdego pliku z osobna. | ||
- | |||
- | ~~Zadanie.#~~ Stwórz wiele plików komendą ''touch file_{a..z}''. \\ Usuń wszystkie te pliki jednym poleceniem ''rm'' 1) bez przełączników 2) z przełącznikiem ''-f'' \\ 3) z przełącznikiem ''-I'' 4) z przełącznikiem ''-i''. | ||
- | |||
- | ~~Zadanie.#~~ Powtórz komendę usuwającą pliki z poprzedniego zadania po usunięciu plików. \\ Potem powtórz tą komendę raz jeszcze z przełącznikiem ''-f''. | ||
- | |||
- | ~~Zadanie.#~~ Stwórz katalog i usuń go używając ''rm''. | ||