Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
so:intro [2023/02/26 23:39] jkonczak utworzono |
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 36: | Linia 37: | ||
Powłoka (ang. shell) to program który udostępnia tekstowy interfejs do systemu operacyjnego. | Powłoka (ang. shell) to program który udostępnia tekstowy interfejs do systemu operacyjnego. | ||
- | Jest wiele implementacji powłoki. Patrz zestawienie: https://en.wikipedia.org/wiki/Comparison_of_command_shells <html><small></html>i [[https://wiki.archlinux.org/title/Command-line_shell|[1]]]<html></small></html> | + | Jest wiele implementacji powłoki. \\ Patrz zestawienie: https://en.wikipedia.org/wiki/Comparison_of_command_shells <html><small></html>i [[https://wiki.archlinux.org/title/Command-line_shell|[1]]]<html></small></html> |
<html><small></html> | <html><small></html> | ||
Linia 55: | Linia 56: | ||
* Systemy GNU/Linux zwykle używają [[https://en.wikipedia.org/wiki/GNU_Core_Utilities|GNU core utilities]] i [[https://en.wikipedia.org/wiki/Util-linux|Linux utilities]] | * Systemy GNU/Linux zwykle używają [[https://en.wikipedia.org/wiki/GNU_Core_Utilities|GNU core utilities]] i [[https://en.wikipedia.org/wiki/Util-linux|Linux utilities]] | ||
- | * Systemy .*BSD dostarczają własnych implementacji [[https://cvsweb.openbsd.org/src/bin/|OpenBSD]] [[https://svnweb.freebsd.org/base/head/bin/|FreeBSD]] | + | * Systemy .*BSD dostarczają własnych implementacji: [[https://cvsweb.openbsd.org/src/bin/|OpenBSD]], [[https://svnweb.freebsd.org/base/head/bin/|FreeBSD]] |
* 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 73: | Linia 74: | ||
<html><small></html> | <html><small></html> | ||
- | Istnieje sporo programów emulujących terminal (dłuższa lista na: [[https://en.wikipedia.org/wiki/List_of_terminal_emulators|list]] on Wikipedia). Poniżej wybór istotniejszych: | + | Istnieje sporo programów emulujących terminal (dłuższa [[https://en.wikipedia.org/wiki/List_of_terminal_emulators|lista]] na Wikipedii). Poniżej wybór istotniejszych: |
* starożytny i dostępny praktycznie wszędzie [[https://en.wikipedia.org/wiki/Xterm|xterm]] | * starożytny i dostępny praktycznie wszędzie [[https://en.wikipedia.org/wiki/Xterm|xterm]] | ||
* 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 ma domyślne aplikację [[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 aktywowane/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 83: | Linia 84: | ||
Poza graficznym interfejsem Linux typowo startuje [[https://en.wikipedia.org/wiki/Getty_(Unix)|program]] umożliwiający logowanie do powłoki w [[https://en.wikipedia.org/wiki/Virtual_console|konsolach wirtualnych]]. | Poza graficznym interfejsem Linux typowo startuje [[https://en.wikipedia.org/wiki/Getty_(Unix)|program]] umożliwiający logowanie do powłoki w [[https://en.wikipedia.org/wiki/Virtual_console|konsolach wirtualnych]]. | ||
\\ | \\ | ||
- | Przełączanie między konsolami wykonuje się skrótem //Ctrl + Alt + Fn//, gdzie //Fn// to klawisz funkcyjny (//F1//÷//F12//). | + | Do przełączania między konsolami służy skrót //Ctrl + Alt + Fn//, gdzie //Fn// to klawisz funkcyjny (//F1//÷//F12//). |
\\ | \\ | ||
Zwykle konsole 1÷6 są tekstowe, konsola 7 to pierwsza konsola graficzna, a część systemów pokazuje komunikaty diagnostyczne na konsoli 12. | Zwykle konsole 1÷6 są tekstowe, konsola 7 to pierwsza konsola graficzna, a część systemów pokazuje komunikaty diagnostyczne na konsoli 12. | ||
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''. | ||
+ | |||
+ | ~~Zadanie.#~~ Wykonaj komendę ''sleep 1h'' i przerwij ją skrótem //Ctrl + c//. | ||
~~Zadanie.#~~ Przełącz się na drugą konsolę wirtualną i zaloguj się na niej. Wykonaj ''pwgen''. Wróć do konsoli graficznej. | ~~Zadanie.#~~ Przełącz się na drugą konsolę wirtualną i zaloguj się na niej. Wykonaj ''pwgen''. Wróć do konsoli graficznej. | ||
Linia 113: | 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 130: | 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 139: | 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 teks 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 na 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''. |
<html><small></html> | <html><small></html> | ||
Linia 153: | Linia 178: | ||
==== Notacja składni poleceń ==== | ==== Notacja składni poleceń ==== | ||
- | W podręcznikach, dokumentacja i przykładach komend tradycyjnie używa się kwadratowych i wąsatych nawiasów do oznaczania, odpowiedio, elementów opcjonalnych i wyboru jednej z możliwości. | + | W podręcznikach, dokumentacjach i przykładach komend tradycyjnie używa się kwadratowych i wąsatych nawiasów do oznaczania, odpowiedio, elementów opcjonalnych i wyboru jednej z możliwości. |
<html><small></html>Czasami losowe nawiasy są używane jako lista możliwości: jest tak jeśli fragmenty zawartości są oddzielone przez ''|''. Ostre nawiasy są czasami używane do nazywania elementów.<html></small></html> \\ | <html><small></html>Czasami losowe nawiasy są używane jako lista możliwości: jest tak jeśli fragmenty zawartości są oddzielone przez ''|''. Ostre nawiasy są czasami używane do nazywania elementów.<html></small></html> \\ | ||
* ''wait [pid]'' oznacza że zarówno ''wait'' jak i ''wait 1234'' są poprawnymi komendami (o ile 1234 jest pidem) | * ''wait [pid]'' oznacza że zarówno ''wait'' jak i ''wait 1234'' są poprawnymi komendami (o ile 1234 jest pidem) | ||
* ''grep --color[=WHEN]'' oznacza że zarówno ''grep --color'' jak i ''grep --color=always'' są poprawne | * ''grep --color[=WHEN]'' oznacza że zarówno ''grep --color'' jak i ''grep --color=always'' są poprawne | ||
- | * ''tar {c|x}'' oznacza że trzeba wpisać ''tar c'' albo ''tar x'' | + | * ''tar {c|x}'' oznacza że trzeba wpisać albo ''tar c'' albo ''tar x'' |
Wielokropek zaznacza że część komendy może się powtarzać, np. ''cat [FILE]...'' wskazuje że ''cat'' może przyjmować wiele nazw plików jako argumenty. | Wielokropek zaznacza że część komendy może się powtarzać, np. ''cat [FILE]...'' wskazuje że ''cat'' może przyjmować wiele nazw plików jako argumenty. | ||
Linia 166: | 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 176: | 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. Autouzupełnianie wywołuje się 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. | ||
- | 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 195: | 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ą. | ||
- | 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> | + | 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> | ||
==== 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 220: | Linia 247: | ||
<html><small></html> | <html><small></html> | ||
- | ~~Zadanie.#~~ Przetestuj następujące przełączniki komendy ''ls'': ''-A'' ''-d'' ''-s'' ''-h'' ''-t'' ''-1'' | + | ~~Zadanie.#~~ Przetestuj następujące przełączniki komendy ''ls'': ''-A'' ''-d'' ''-s'' ''-h'' ''-t'' ''-1'' |
- | Poza ''ls'', są dostępne standardowe komendy ''dir'' i ''vdir'' do wyświetlania plików. | + | Poza ''ls'' do wyświetlania plików dostępne są standardowe komendy ''dir'' i ''vdir''. |
\\ | \\ | ||
- | Powłoka często jest konfigurowana tak by ''ls'' domyślnie używał kolorów, oraz by ''ll'' było rozumiane jako ''ls -l'', a ''la'' jako ''ls -l -a''. | + | Powłoka często jest konfigurowana tak by ''ls'' używał kolorów, oraz by ''ll'' było rozumiane jako ''ls -l'', a ''la'' jako ''ls -l -a''. |
Program ''tree'' wyświetla rekurencyjnie zawartość katalogu w postaci drzewa. | Program ''tree'' wyświetla rekurencyjnie zawartość katalogu w postaci drzewa. | ||
Linia 232: | 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). Bez podania celu ''cd'' przejdzie do katalogu domowego. | + | Aby zmienić katalog roboczy można użyć komendy **''cd [//cel//]''** (change directory). |
+ | \\ | ||
+ | Bez podania celu ''cd'' przejdzie do katalogu domowego. | ||
\\ | \\ | ||
<html><small></html>Jeśli jako cel poda się ''-'', katalog roboczy zostanie zmieniony na poprzednio używany<html></small></html> | <html><small></html>Jeśli jako cel poda się ''-'', katalog roboczy zostanie zmieniony na poprzednio używany<html></small></html> | ||
Linia 247: | Linia 276: | ||
~~Zadanie.#~~ Wróć tam gdzie byłeś wcześniej używając ''cd -'' | ~~Zadanie.#~~ Wróć tam gdzie byłeś wcześniej używając ''cd -'' | ||
- | |||
- | To change directory and save the previous one can use ''pushd //dir//'' command. \\ | ||
- | ''pushd //dir//'' pushes the previous directory on a directory stack. The directory stack can be displayed with ''dirs'' command. \\ | ||
- | To change back one can either execute ''popd'' (that removes a directory from the stack and enters it) or ''pushd'' (that swaps current directory with the directory on the stack). ''pushd'' and ''popd'' accept arguments ''+n''/''-n'' that select directory on the stack. | ||
Aby zmienić katalog i zapamiętać poprzedni można użyć komendy ''pushd //cel//''. \\ | Aby zmienić katalog i zapamiętać poprzedni można użyć komendy ''pushd //cel//''. \\ | ||
''pushd //cel//'' umieszcza poprzedni katalog na stosie katalogów. Stos katalogów może być wyświetlony komendą ''dirs''. \\ | ''pushd //cel//'' umieszcza poprzedni katalog na stosie katalogów. Stos katalogów może być wyświetlony komendą ''dirs''. \\ | ||
- | Aby wrócić do zapamiętanego katalogu, można wykonać komendę ''popd'' (usuwającą katalog ze stosu i wchodzącą do niego) lub ''pushd'' (zamieniającą bieżący katalog z katalogiem na stosie). ''pushd'' i ''popd'' przyjmują argumenty ''+n''/''-n'' wybierające n-ty katalog od szczytu / dna stosu. | + | Aby wrócić do zapamiętanego katalogu, można wykonać komendę ''popd'' (usuwającą katalog ze stosu i wchodzącą do niego) lub ''pushd'' (zamieniającą bieżący katalog z katalogiem na stosie). \\ ''pushd'' i ''popd'' przyjmują argumenty ''+n''/''-n'' wybierające n-ty katalog od szczytu / dna stosu. |
<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ć tekst zawierający znaki ''*'', ''?'' lub wyrażenia w kwadratowych nawiasach ''[…]''. Każdy tekst zawierający takie znaki jest nazywany [[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'', a ''[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 268: | 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 285: | 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 //file//''. 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 //filename//''. | ||
- | <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 systemy plików Linuksa 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 jest ta informacja wyświetlana. | ||
- | |||
- | Miejsce na dysku wykorzystywane przez plik jest zwracane, 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 który zawiera 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'' (od copy) i przenosić (bądź zmieniać nazwę) komendą ''mv'' (od 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.#~~ 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''. | ||
- | |||
- | <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> | ||
- | |||
- | Microsoft 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, który pozwala 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 od tego 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. Uważaj szczególnie 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'' switch 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''. | ||