Większość współczesnych komputerów (i podobnych urządzeń np. tabletów i telefonów) wyposażonych jest w system operacyjny oraz towarzyszące mu oprogramowanie. Z całą pewnością korzystałeś/aś z systemów operacyjnych firmy Microsoft – rodziny Windows. Mogłeś/aś też zetknąć się z systemem Android (czyli odmianą Uniksa) od Google czy iOS od Apple. W większości przypadków system posiada tzw. interfejs graficzny, czyli GUI (Graphical User Interface). Systemy te są zasadniczo podobne i np. uruchomienie przeglądarki internetowej czy przeglądanie plików nie jest dla nikogo wyzwaniem.
Jednak nie każdy komputer posiada GUI, dotyczy to np. rozbudowanych komputerów wykorzystywanych w obliczeniach numerycznych (np. wyznaczanie właściwości aerodynamicznych samochodu z użyciem programu Fluent). W takim przypadku nie ma możliwości skorzystania z myszki i obejrzenia czegoś na ekranie, ponieważ komputer znajduje się w serwerowni, czasami w innym kraju. Aby korzystać z takiego zdalnego komputera musimy połączyć się z nim za pomocą specjalnego programu, który pozwoli nam na wydawanie mu polecenia w trybie tekstowym. Tryb tekstowy posiada m.in. następujące zalety:
Uruchom komputer wybierając system operacyjny Linux (Ubuntu). Jeśli
pracujesz na własnym komputerze z systemem Windows, możesz zainstalować
Linux jako podsystem, patrz https://learn.microsoft.com/en-us/windows/wsl/install.
Następnie uruchom terminal nawigując z menu głównego lub poprzez skrót
klawiszowy Ctrl + Alt + T (T jak terminal).
Zobaczysz linijkę podobną do:
stud@lab:~$
Jest to tzw. znak zachęty i oznacza, że jako użytkownik
stud jesteśmy zalogowani na komputer lab.
Między znakami : i $ znajduje się katalog, w
którym się aktualnie znajdujemy. W tym przypadku jesteśmy katalogu
domowym. Znak ~ to skrót, którego rozwinięcie to
/home/stud.
Wpisz w konsoli polecenie date i wciśnij enter. Komputer
wyświetli aktualną (jego zdaniem) datę i godzinę. Poniżej ponownie
wyświetli się linijka kończącą się na $, oznaczającą, że
komputer czeka na nowe polecenia. Używając strzałek góra i
dół możesz przeglądać historię poleceń. Wciśnięcie klawiszy
Ctrl + R uruchomi opcję wyszukiwania poleceń w historii.
Klasyczny znak zachęty zostanie zastąpiony przez
Wyszukujemy przez wpisywanie kolejnych znaków z szukanego polecenia,
a po dwukropku system pokaże podpowiedź. Kolejne wciśnięcie
Ctrl + R pokaże nastęþną sugestię. Innym ułatwieniem jest
dopełnianie nazw. Jeśli wpiszesz dat i naciśniesz 2x
klawisz Tab, wyświetlona zostanie lista poleceń
zaczynających się na dat. Jeśli jest tylko jedno takie
polecenie, nazwa zostanie dokończona. Pamiętaj o tych trikach – znacznie
ułatwiają pracę w trybie tekstowym.
Pracując w trybie tekstowym, zawsze pracujemy w jakimś katalogu, tzw.
katalogu bieżącym. Jeśli uruchomimy jakiś program, np. prosty program
czytający dane z pliku z Informatyki I, będzie on odczytywał pliki
znajdujące się w tym katalogu. Każdy program, którego będziesz używać, a
który potrzebuje nazwy pliku lub katalogu (np. do kopiowania), może ją
otrzymać w dwóch postaciach. Pierwsza to tzw. ścieżka bezwzględna,
zaczynająca się od znaku / np:
/home/students/stud01
/usr/bin/bash
/etc
Sprawdź, w jakim katalogu się znajdujesz przez wpisanie polecenia
pwd (od print working directory).
Aby zmienić katalog, wykorzystuje się polecenie cd (od
change directory), np.
stud01@eto:~$ cd /tmp
stud01@eto:/tmp$ pwd
/tmp
stud01@eto:~$
Teraz przejdź do katalogu /home i sprawdź czy się udało,
z użyciem polecenia pwd. Aby powrócić do katalogu domowego
wpisz
stud01@eto:~$ cd ~
Znak \(\sim\) zawsze oznacza katalog domowy użytkownika.
Dodatkowo, oprócz ścieżki bezwzględnej, można podać ścieżkę względną:
../ oznacza katalog nadrzędny,/ oznacza katalog główny (początek każdej ścieżki
bezwzględnej),. i ./ oznaczają katalog bieżący (ten
zwracany przez polecenie pwd).Poeksperymentuj teraz z poruszaniem się po katalogach. Jeśli
wpisywanie ścieżek Cię znudzi wypróbuj program mc. Pozwala
on m. in. na graficzne poruszanie się po drzewie katalogów. Z programu
wychodzimy przez wciśnięcie klawisza F10 lub wpisanie
exit.
Do tworzenia katalogów służy polecenie mkdir (od
make directory) np.
Do sprawdzenia zawartości aktualnego katalogu polecenie
ls (od list). Stwórz teraz katalogi A, B, C i D,
każdy wewnątrz poprzedniego. Aby to zrobić będziesz musiał stworzyć
katalog A, przejść do niego, następnie stworzyć B, itd. Do usuwania
katalogów służy polecenie rmdir (od remove
directory). Usuń teraz stworzone katalogi.
Za pomocą rmdir nie można usunąć katalogu posiadającego
zawartość. W tym celu należy wykorzystać polecenie rm -r.
Znaki -r po nazwie programu rm są argumentem
programu i oznaczają, że katalog ma być usuwany rekurencyjne. Podobne
argumenty posiada większość poleceń, np. ls -l pokazuje
zawartość danego katalogu w postaci listy zawierającej różne informacje
o pliku.
Komenda echo wypisuje na ekran ciąg znaków, który podany
jest jako jej argument. Można to wykorzystać do stworzenia pierwszego
pliku (o znaczeniu symbolu > powiemy więcej na kolejnych
zajęciach)
Aby wyświetlić zawartość pliku na ekranie używamy polecenia
cat
Do kopiowania służy komenda cp [SKĄD] [DOKĄD]. Stwórz
teraz katalog i skopiuj do niego Twój plik. Powinno to wyglądać tak:
Aby przenieść/zmienić nazwę pliku lub katalogu używamy polecenia
mv [SKĄD] [DOKĄD]. Przejdź do nowego katalogu i zmień nazwę
pliku. Następnie usuń plik poleceniem rm.
Nie zawsze trzeba podawać pełną nazwę pliku/katalogu, który chcemy
wykorzystać jako argument programu. Wciśnięcie klawisza Tab
dokończy wpisywaną nazwę. Jeśli podpowiedź nie jest jednoznaczna, po
dwukrotnym naciśnięciu klawisza Tab w konsoli zostaną
wyświetlone nazwy wszystkich plików/katalogów zaczynające się od
wpisanych znaków.
Znakomita większość komend trybu tekstowego posiada porządną dokumentację dostępną od ręki, np.:
W przypadku komendy man dostajemy obszerniejszą
dokumentację. Tekst przewija się za pomocą strzałek. Aby zakończyć
przeglądanie należy wcisnąć Q. Sprawdź instrukcje dla
poleceń who, whoami, head i
date. Sprawdź jak działają.
tarProgram tar służy do pakowania i rozpakowywania drzewa
katalogów i plików w jeden plik (archiwum). Plik wynikowy niekoniecznie
musi być mniejszy niż oryginalne pliki. Dopiero użycie kompresji
zmniejszy rozmiar. Przygotuj najpierw kilka plików do spakowania:
Teraz spakuj je, a następnie obejrzyj zawartość archiwum za pomocą
programu mc.
Sprawdź zawartość spakowanego katalogu, następnie usuń go i rozpakuj archiwum.
Sprawdź poleceniem ls -lah objętość utworzonego
archiwum. Następnie spakuj te same pliki z dodatkową flagą
z. Dodanie tego parametru uruchamia kompresję programem
gzip. Zmień rozszerzenie archiwum na tar.gz.
Sprawdź czy plik wynikowy jest mniejszy.
Najważniejszym aspektem pracy w trybie tekstowym jest możliwość tworzenia skryptów, czyli zapisanych w pliku kolejnych komend wykonywanych tak, jakbyśmy wpisywali je z klawiatury. Więcej o zaawansowanych skryptach dowiesz się na następnych laboratoriach, pierwszy napiszesz dzisiaj.
Prostymi i dość wygodnymi edytorami tekstu są nano i
vim. Uruchom program nano komendą
nano skrypt.sh i zapisz do niego pierwszy skrypt:
Następnie zmień uprawnienia, aby pozwolić na uruchomienie naszego skryptu:
Polecenie chmod służy do zmiany uprawnień pliku.
u oznacza użytkownika (czyli Ciebie), któremu chcemy nadać
(+) prawo uruchamiania (x, od
execute) skryptów/programów.
Bash obsługuje zmienne, tak jak każdy język programowania Nie występuje tu jednak typowanie. Aby stworzyć zmienną zawierającą tekst piszemy:
Natomiast wynik działania jakiegoś programu (tzn. wydrukowany przez niego tekst) możemy zapisać do zmiennej w następujący sposób:
Aby odczytać zmienną piszemy:
Przygotuj strukturę katalogów:
zawierając niezbędne komendy w skrypcie. Plik plik.txt
ma zawierać datę zwracaną przez polecenie date.
Zmodyfikuj skrypt tak, aby nazwa każdego katalogu zaczynała się przedrostkiem przekazanym do skryptu przy jego uruchomieniu.
Abu uruchomić skrypt wraz z dwoma argumentami arg1 i
arg2 należy wpisać
Do argumentów arg1 i arg2 mamy dostęp z
wewnątrz skryptu dzięki tzw. zmiennym programowym. Jest ich dziewięć
$1 – $9, w tym przypadku będą to zmienne
$1 i $2.
Przygotuj skrypt zawierający:
i uruchom go w katalogu zawierającym pliki z rozszerzeniem
.txt. W jaki sposób działa? Pamiętaj o argumencie
skryptu!
Napisz skrypt, który tworzy katalog o nazwie podanej jako pierwszy
argument skryptu $1 i kopiuje do niego wszystkie pliki
.txt dodając do ich nazwy przedrostek podany jako drugi
argument $2. Co się stanie jeśli nie podasz argumentów do
skryptu?
Narzędzia, które wykorzystalywaliśmy powyżej nie są w żaden sposób “magiczne”, możemy napisać własne. W tym celu zademonstrujemy jak skompilować i uruchomić proste programy w języku C.
Uwaga: jeśli chcesz korzystać z C++, nie C, w
poniższych poleceniach zamień gcc na g++
(możesz też zmienić rozszerzenia plików na .cpp, ale na
Linuxie rozszerzenia nie mają znaczenia).
Hello, World! z konsoliUtwórz plik źródłowy helloworld.cc o zawartości
Następnie skompiluj go używając kompilatora gcc:
Zauważ, że w bieżącym katalogu pojawił się plik
helloworld.x (gdybyśmy nie podali opcji -o,
domyślna nazwa to a.out). Uruchom go wołając
./helloworld.x.
Naturalnie nasuwa się pytanie, skąd program wie, jakie argumenty
zostały do niego podane? W językach C i C++ funkcja main
może przyjmować 2 argumenty:
int, zawierający liczbę podanych
argumentów plus 1, zwyczajowo nazywany argc, od
argument countchar**, zawierający tablicę stringów
reprezentujących argumenty, zwyczajowo nazywany argv, od
argument values. Pierwszy element tablicy zawiera nazwę
wywołanego programu (stąd argc jest o jeden większe)Przykładowo, program drukujący argumenty może wyglądać następująco:
#include <stdio.h>
int main(int argc, char** argv) {
for(int i = 1; i != argc; ++i)
printf("%s\n", argv[i]);
}Skompiluj powyższy program i zobacz co wydrukuje, gdy podasz do niego
argumenty, np. -a -b -c. Porównaj co stanie się, gdy
umieścisz argumenty w cudzysłowie.