Skip to content

Powłoka

Wprowadzenie

Podczas tego kursu będziemy pracować w systemie Linux. W pracowni, po zalogowaniu mamy dostęp do konta wydziałowego. Do danych z tego konta możemy również dostać się zdalnie za pomocą serwera student.tcs.uj.edu.pl (w katalogu /afs na serwerze). Aby zalogować się na serwer, należy w wierszu poleceń (terminalu) użyć komendy:

ssh student.tcs.uj.edu.pl

Po otwarciu konsoli (lub udanym zalogowaniu), użytkownik ma dostęp do powłoki systemowej (ang. shell). Powłoka to program będący pośrednikiem pomiędzy systemem operacyjnym a użytkownikiem. Użytkownik wydaje polecenia dla systemu poprzez wpisywanie komend, powłoka zaś interpretuje kolejne polecenia i uruchamia odpowiednie programy. W systemach uniksowych najpopularniejszą powłoką jest bash (Bourne-Again SHell).

Gdy powłoka oczekuje kolejnej komendy, wyświetlany jest command prompt. Typowy wiersz składa się z podstawowej informacji o systemie, zakończonej znakiem $, po którym możemy wpisać komendę i otrzymać wynik. Przykładowo komenda whoami zwróci nam nazwę naszego użytkownika:

gutowski@student:~$ whoami
gutowski
Tak jak w tym przykładzie, gdy wyjaśnia się interakcję pomiędzy użytkownikiem a powłoką, często przedstawia się zarówno to co wpisał użytkownik, jak i to co w odpowiedzi wypisał komputer.

Typowe dystrybucje Linuxa wyposażone są w graficzny interfejs użytkownika (ang. GUI -- Graphical User Interface). Taki interfejs pozwala na bardziej intuicyjne wydawanie poleceń przy pomocy myszki, np. poprzez klikanie w ikonki i ich przesuwanie. Większość takich operacji jest jednak tłumaczona na polecenia powłoki.

Dla programisty pracującego w systemie Linux, bezpośrednie korzystanie z powłoki zamiast GUI jest często wygodniejsze:

  • GUI pozwala jedynie na podstawowe operacje, często zorientowane na pracownika biurowego niezwiązanego z programowaniem.
  • Shell daje znacznie większy wachlarz możliwości, udostępniając bardziej nietypowe polecenia, np. związane z programowaniem i kompilacją.
  • Shell pozwala na łączenie komend w bardziej skomplikowane polecenia.
  • Komendy powłoki mogą być zapisane w pliku celem ich późniejszego, lub wielokrotnego wykonania. Tak powstałe skrypty pozwalają na automatyzację pracy.
  • Komendy powłoki z łatwością mogą być udostępniane innym użytkownikom. Różne dystrybucje Linuxa posiadają inne interfejsy graficzne, ale podstawowe komendy shella pozostają takie same.
  • Tutoriale i instruktaże (np. jak zainstalować daną aplikację) często korzystają z poleceń shella, ze względu na ich precyzję i uniwersalność.

Z tych powodów na tym kursie skupiamy się właśnie na poleceniach powłoki - podstawowym środowisku programisty. Wiedza tu zdobyta pozwoli na sprawne posługiwanie się systemem i ułatwi pracę nad każdym projektem, nad którym przyjdzie Wam pracować.

Pomoc

Powłoka systemu Linux standardowo jest wyposażona w bardzo wiele instrukcji. Każda z komend posiada swoje parametry, modyfikujące efekt jej użycia. Często są one bardzo rozbudowane.

Gdy chcemy poznać możliwości danego polecenia, z pomocą spieszy nam wywołanie

man <komenda>
Tam znajdziemy szczegółowy opis komendy i jej parametrów. Przykładowo:

gutowski@student:~$ man whoami
(...)
NAME
       whoami - print effective user name

SYNOPSIS
       whoami [OPTION]...

DESCRIPTION
       Print the user name associated with the current effective user ID.  Same as id -un.

       --help display this help and exit

       --version
              output version information and exit
(...)
Jak widać, whoami działa w jeden sposób, ale jest też komenda id o większych możliwościach. Żeby dowiedzieć się więcej o niej, możesz wykonać:
man id

Nie trzeba więc spamiętywać wszystkich przypadków użycia. Często wystarcza ogólna intuicja co robi dana komenda, a przy konkretnej potrzebie szukamy szczegółów w manualu. Często okaże się, że ta albo podobna komenda z odpowiednim parametrem wykona właśnie to czego potrzebujemy.

Poruszanie się po systemie plików

Ważnym elementem każdego systemu operacyjnego jest możliwość przechowywania danych. Dane są przechowywane w postaci niezależnych plików (ang. file), dzielących wspólną pamięć (przeważnie dyskową, ale nie tylko). Ze względu na dużą liczbę plików, są one zorganizowane w drzewo katalogów (ang. directory).

Pliki użytkownika w typowym systemie linuksowym znajdują się w katalogu /home/<login>, gdzie <login> to nazwa użytkownika. Przykładowo, dla użytkownika gutowski, katalog domowy to /home/gutowski.

  • pierwsze / oznacza korzeń drzewa katalogów (ang. root directory), wszystkie pliki obsługiwane przez system znajdują się w tym katalogu,
  • home to nazwa katalogu (znajdującego się bezpośrednio w korzeniu), w którym przechowywane są pliki wszystkich użytkowników systemu,
  • gutowski to podkatalog katalog home, w którym znajdują się pliki użytkownika gutowski.

Podczas pracy z bashem, w każdej chwili użytkownik znajduje się w jakimś katalogu. Komenda pwd pozwala szybko określić aktualny katalog (ang. current/working directory):

gutowski@student:~$ pwd
/home/gutowski

Polecenie ls -al wyświetla zawartość bieżącego katalogu wraz z dodatkowymi informacjami na temat plików i folderów (znaczenie kolumn zostanie wyjaśnione później).

gutowski@student:~$ ls -al
total 204
drwx--x---  16 gutowski www-data  4096 Oct 14 10:07 .
drwxr-xr-x 444 root     root     12288 Oct  9 16:00 ..
lrwxrwxrwx   1 gutowski gutowski    44 Oct  8  2012 afs -> /afs/matinf.uj.edu.pl/usr/staff/tcs/gutowski
lrwxrwxrwx   1 gutowski gutowski    25 Oct 12  2017 apache_log -> /var/log/apache2/gutowski
-rw-------   1 gutowski gutowski 30062 Oct 14 00:32 .bash_history
-rw-r--r--   1 gutowski gutowski   220 Feb 25  2020 .bash_logout
-rw-r--r--   1 gutowski gutowski  3858 Nov 15  2022 .bashrc
drwxrwxr-x   3 gutowski gutowski  4096 Oct 24  2023 .byobu
drwx------  10 gutowski gutowski  4096 Mar  5  2024 .cache
drwx------   9 gutowski gutowski  4096 Mar 11  2024 .config
-rw-r--r--   1 gutowski gutowski   807 Feb 25  2020 .profile
drwxr-xr-x   3 gutowski gutowski  4096 Jan 22  2019 public_html
drwxr-x---   2 gutowski gutowski  4096 Oct 14 09:45 .ssh
lrwxrwxrwx   1 gutowski gutowski    27 Feb 13  2010 storage -> /mnt/storage/users/gutowski
drwx------   1 gutowski gutowski    13 Dec 19  2022 Sync 
drwx------   2 gutowski gutowski  4096 Oct 17  2023 srodowisko
-rw-------   1 gutowski gutowski 38256 Oct 13 22:18 .viminfo
-rw-------   1 gutowski gutowski   450 Oct 14 09:45 .Xauthority

W kolejnych kolumnach wyświetlane są następujące informacje:

  • Pierwszy znak odpowiada za typ pliku: - to zwykły plik, d katalog, l link (skrót) do pliku, b albo c oznaczają urządzenie np. dysk twardy. Pozostałe 9 znaków odpowiada za prawa dostępu do pliku/katalogu/zasobu. Pierwsze 3 odpowiadają za prawa aktualnego użytkownika, następne 3 za prawa grupy, ostatnie 3 za prawa wszystkich użytkowników. Istnieją 3 podstawowe prawa, kolejno: r (read) prawo odczytu, w (write) prawo zapisu, x (execute) prawo wykonania, natomiast - oznacza, że użytkownik nie ma danego prawa.
  • Liczba w kolumnie oznacza ile bloków pamięci zajmuje dany plik/katalog (dla pliku jest to 1, dla folderu ilość folderów znajdujących się bezpośrednio w nim)
  • Właściciel pliku/katalogu.
  • Grupa do której należy właściciel pliku/katalogu.
  • Rozmiar pliku/katalogu w bajtach (rozmiar katalogu jest zawsze taki sam, nie są w niego wliczone rozmiary plików i katalogów które zawiera).
  • Data utworzenia/zmodyfikowania pliku/katalogu.
  • Nazwa pliku/katalogu.

Plik/katalog jest ukryty gdy jego nazwa zaczyna się od kropki. Zwróć uwagę na dwa pierwsze katalogi w przykładzie . i .. reprezentują one odpowiednio aktualny katalog i katalog nadrzędny. Takie dwa ukryte katalogi znajdują się w każdym katalogu. Szczególny przypadek to katalog główny /, który sam dla siebie jest katalogiem nadrzędnym, a więc . i .. reprezentują tam ten sam katalog.

Ponadto, katalog ~ w dowolnym kontekście oznacza katalog domowy danego użytkownika.

Przydatne polecenia:

  • pwd - podaje pełną ścieżkę dostępu do aktualnego katalogu
  • ls - wyświetla zawartość podanego katalogu
  • cd - zmienia aktualny katalog
  • touch - uaktualnienia czas ostatniej modyfikacji pliku lub tworzy nowy plik
  • mkdir - tworzy katalog
  • rmdir - usuwa pusty katalog
  • rm - usuwa pliki
  • cp - kopiuje pliki
  • mv - przenosi pliki
  • chmod - zmienia prawa dostępu
  • du - wyświetla zużycie dysku
  • find - wyszukuje pliki z zaawansowanymi filtrami

Praca z plikami

Podstawowym rodzajem pliku jest plik tekstowy, składa się on ze znaków czytelnych dla człowieka. Poniższe podstawowe komendy pozwalają na przeglądanie i edycję takich plików:

  • cat - kopiuje zawartość pliku (lub standardowego wejścia) na standardowe wyjście
  • tac - podobnie, ale odwracając kolejność linijek
  • sort - podobnie, ale sortuje linijki zgodnie z zadanym kluczem
  • uniq - podobnie, ale usuwa powtórzone linijki
  • head - podobnie, ale tylko początkowe linijki
  • tail - podobnie, ale tylko końcowe linijki
  • less - podobnie, ale z interkatywnym podglądem
  • wc - zlicza linijki, słowa i znaki w pliku (lub standardowym wejściu)

Anatomia polecenia

Powyżej przedstawiliśmy kilkanaście podstawowych poleceń powłoki. Mimo różnic w działaniu można wyszczególnić kilka cech wspólnych.

Każde polecenie składa się z nazwy i list argumentów. Można wyszczególnić trzy rodzaje argumentów:

  • Flaga -- zmienia działanie polecenia samym faktem że jest wymieniona. Na przykład komenda ls działa inaczej gdy wywołujemy bez argumentów, a inaczej gdy zaistnieje flaga -l lub flaga -s. Flagi typowo rozpoczynają się pojedynczym znakiem - i pojedynczą literą. Gdy występuje wiele flag, można je połączyć razem, np. ls -a -l oznacza to samo co ls -al.

Poza jednoliterowymi flagami, mogą być też ich dłuższe wersje. Wtedy rozpoczynamy podwójnym -- i pełną nazwą, n.p. ls -a oznacza to samo co ls --all. Flag wieloznakowych nie można łączyć, każda zaczyna się od osobnego --.

Uwaga: niektóre instrukcje używają pojedynczego - także do argumentów wieloznakowych.

  • Wartości -- wymagają podania konkretnej liczby lub nazwy by dany argument miał sens. Takie argumenty przekazuje się bezpośrednio po nazwie argumentu. Na przykład dla komendy find możemy przekazać -size 20c by znaleźć pliki o wielkości 20 znaków. Przekazanie samego -size tak jakby to była flaga nie miałoby sensu.

Czasami komenda wymaga znaku = pomiędzy nazwą argumentu a jego wartością.

  • Argument pozycyjny -- argumenty dla których nie podaje się nazwy tylko samą wartość. Znaczenie danego argumentu zależy od jej pozycji w liście argumentów. Na przykład dla cp komenda traktuje wszystkie argumenty pozycyjne poza ostatnim jako źródła, a ostatni jako punkt docelowy. Na przykład cp A B K skopiuje dwa pliki A i B to katalogu K.

Działanie komendy często nie zależy tylko od argumentów. Wiele komend czyta dłuższe dane ze standardowego wejścia, czyli domyślnie z klawiatury. Działanie komendy może zależeć też od ogólnego stanu systemu. Np. to co wypisze komenda pwd zależy od katalogu w którym ją wywołujemy.

Komenda wypisuje wynik na standardowe wyjście, którym domyślnie jest ekran terminala. Komenda może też zmienić coś w systemie, np. dodać lub usunąć pliki, bądź zmienić aktualny katalog.

Przekierowanie strumieni

Dla niektórych komend domyślne działanie jest mało praktyczne. Na przykład, po co komu komenda sort czytająca tekst z klawiatury (zakończony Ctrl+D) i sortująca go alfabetycznie z wynikiem wyświetlonym ponownie na ekranie? Operacje takie mają większy sens gdy standardowe wejście lub wyjście zostanie przekierowane. Wejściem lub wyjściem wcale nie musi być klawiatura czy ekran, ale dowolny plik.

  • komenda > plik -- przekierowuje standardowe wyjście komendy do nowego pliku o podanej nazwie. Jeśli plik już istniał, jego stara wersja zostanie skasowana.
  • komenda >> plik -- przekierowuje standardowe wyjście komendy do pliku. Jeśli ów plik już istniał, dopisuje wynik do jego końca.
  • komenda < plik -- wczytuje plik jako standardowe wejście do komendy.

Na przykład polecenie

ls -al > out.txt
sprawdzi w systemie jaka jest zawartość aktualnego katalogu i wypisze wynik do pliku out.txt.