pdf - Środowisko programisty

Transkrypt

pdf - Środowisko programisty
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
Polecenia powłoki
Wprowadzenie
Podczas tego kursu będziemy pracować w systemie Linux. W pracowni, po zalogowaniu
mamy dostęp do konta wydziałowego. Do konta wydziałowego możemy dostać się zdalnie
za pomocą serwera student. Wystarczy przejść do podkatalogu afs katalogu domowego. W
wierszu poleceń (terminal ) wpisujemy ssh nazwa_uż[email protected]
aby zalogować się na konto użytkownika na serwerze dla studentów. W systemie Windows
możemy wykonać tę operację za pomocą programu putty, który należy pobrać z internetu.
Po udanym zalogowaniu, użytkownik łączy się z powłoką systemową. Powłoka systemowa
(ang. shell ) to program będący pośrednikiem pomiędzy systemem operacyjnym a użytkownikiem.
Użytkownik wydaje polecenia dla systemu poprzez wpisywanie komend dla powłoki.
Można powiedzieć, że pełni funkcję interpretera kolejno wpisywanych poleceń. W systemach
uniksowych najpopularniejszą powłoką jest bash (ang. Bourne-Again SHell ).
Gdy powłoka oczekuje kolejnej komendy, wyświetlany jest wiersz poleceń (ang. command
prompt). Typowy wiersz składa się z podstawowej informacji o systemie, zakończony
znakiem $, po którym możemy wpisać komendę. Jeśli np. wpiszemy whoami, naszym
oczom ukaże się mniej więcej:
$ whoami
pdan
przy założeniu, że pdan to Wasz login. Tak jak w tym przykładzie, często gdy wyjaśnia
się interakcję pomiędzy użytkownikiem a powłoką, przedstawia się zarówno to co wpisał
użytkownik (linie rozpoczynające się od $), jak i to co w odpowiedzi wypisał komputer
(bez $ na początku).
Typowe dystrybucje Linuxa wyposażone są w graficzny interfejs1 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. Każda taka
operacja 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 nie zwią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 skrypty i automatyzację
pracy.
1
ang. interface. Ktoś kiedyś chciał to tłumaczyć jako „międzymordzie”, ale na szczęście się nie przyjęło
Strona 1/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
∗ Komendy powłoki mogą być zapisane w pliku celem ich późniejszego, lub wielokrotnego
wykonania.
∗ 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 jakie można znaleźć w Internecie (np.
jak zainstalować i skonfigurować daną aplikację) często korzystają z poleceń shella,
ze względu na ich precyzję i uniwersalność.
Z tych powodów na naszym kursie skupiamy się właśnie na poleceniach powłoki. Wiedza
tu zdobyta pozwoli Wam na sprawne dostosowanie środowiska do Waszych potrzeb i
potrzeb każdego projektu, nad którym przyjdzie Wam pracować.
Pomoc
W pozostałej części dzisiejszego kursu przestawimy podstawowe instrukcje shella. Lista
ta nie jest wyczerpująca: przedstawiamy tylko te najbardziej podstawowe komendy i nie
wyjaśniamy ich wszystkich możliwych parametrów. Dlatego warto wiedzieć jak umieć
dowiedzieć się czegoś. Z pomocą spieszy nam komenda man (ang. manual ). Wywołanie
man <komenda> pozwoli nam przeczytać szczegółowy opis <komenda>, wraz z wszystkimi
możliwymi parametrami jakie możemy tam przekazać.
Na przykład, wywołując man whoami dowiemy się, że:
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 można wyczytać, whoami działa tylko w jeden określony sposób, ale istnieje podobna
komenda id która ma większe możliwości.
Dlatego jeżeli staniecie przed jakimś problemem, gdzie dana komenda wydaje się być
niewystarczająca, zachęcamy przeczytać manual — być może okaże się, że ta albo podobna
komenda z jakimś dodatkowym parametrem wykona właśnie to czego oczekujecie.
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, dzielące 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> należy zamienić Waszym loginem. Jeśli np. moja nazwa użytkownika to
Strona 2/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
pdan, to mój katalog domowy byłby /home/pdan.
∗ 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ąca się bezpośrednio w korzeniu w którym przechowywane
są pliki wszystkich użytkowników systemu
∗ <login>, np. pdan to podkatalog home-a w którym znajdują się Wasze pliki.
Podczas pracy z bashem, w każdej chwili użytkownik “znajduje się” w jakimś katalogu.
Komenda pwd pozwala szybko określić jaki jest aktualny katalog (ang. current directory
/ working directory):
$ pwd
/ home / pdan
Polecenie ls -al wyświetla całą zawartość bieżącego katalogu wraz z dodatkowymi informacjami
na temat plików i folderów.
22
21
22
22
21
10:47
22:09
10:40
10:39
22:17
.
..
plik - admina
README . txt
Srodowisko
nazwa pliku
Sep
Sep
Sep
Sep
Sep
ostatnia
modyfikacja
wielkość pliku
grupa
właściciela
właściciel
liczba połączeń
prawa dostępu
typ pliku
$ ls - al
total 12
drwxrwxr - x 3 kecim kecim 4096
drwx - - - - - x 44 kecim users 4096
-r - -r - - - - - 1 kecim kecim 100
-rw - rw -r - - 1 kecim kecim
32
drwxrwxr - x 2 kecim kecim 4096
Na kolejnych zajęciach wyjaśnimy w szczegółach znaczenie poszczególnych kolumn.
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.
pwd
ls
cd
-l
-a
<nazwa>
podaje pełną ścieżkę dostępu do aktualnego
katalogu
wyświetla zawartość podanego katalogu
wyświetla dodatkowe informacje o plikach
wyświetla pliki ukryte, zaczynające się od .
zmienia aktualny katalog na <nazwa>
Strona 3/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
touch
<nazwa>
mkdir
<nazwa>
-p
rm
<nazwa>...
-r
cp
<z>... <do>
mv
<z>... <do>
chmod <flagi> <plik>...
du
<plik>...
find
-b
-h
<katalog> -name <plik>
-size <n>
uaktualnienia czas ostatniej modyfikacji pliku
<nazwa>. Jeśli plik nie istnieje to tworzy pusty
tworzy pojedynczy katalog o podanej nazwie
tworzy wszystkie niezbędne katalogi na ścieżce
<nazwa>
usuwa pliki <nazwa> (proponujemy nie używać
rmdir)
Usuwa katalog <nazwa>, wraz z całą zawartością
kopiuje pliki <z> do pliku/katalogu <do>
przenosi pliki <z> do pliku/katalogu <do>
zmienia prawa własności plików i katalogów
wyświetla rozmiar każdego wymienionego pliku
(z osobna) Na typowym systemie blok to 1024
bajty, ale ogólnie ich wielkości mogą być różne na
różnych systemach.
wyświetla wielkość w bajtach a nie blokach
wyświetla wielkość w wygodnych jednostkach
szuka <plik> w <katalog>-u i jego podkatalogach
szuka plików wielkości <n> bloków, gdzie każdy
blok to 512 bajtów.
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:
wyświetla <tekst> na standardowym wyjściu
wyświetla poprawnie <tekst>, nawet gdy zawiera znaki specjalne,
takie jak spacje, #, !, etc...
cat
<pliki>... łączy <pliki> w jedną całość i wypisuje je na standardowe wyjście
-n
wyświetla numery linii
-E
wyświetla końce linii znakiem $
tac
<pliki>... łączy <pliki>, ale wyświetla linie w odwrotnej kolejności
wc
<pliki>... liczy linie, słowa i znaki z <pliki>
-c
wyświetla liczbę znaków
-w
wyświetla liczbę słów
-l
wyświetla liczbę linii
head
wyświetla początkowe linie pliku
-<n>
wyświetla pierwszych <n> linii
tail
wyświetla końcowe linie pliku
-<n>
wyświetla ostatnich <n> linii
sort
sortuje linie ze standardowego wejścia
echo
<tekst>
’<tekst>’
Strona 4/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
sortuje linie w odwrotnej kolejności
przepisuje linie ze standardowego wejścia, omijając sąsiadujące
powtórzenia
-r
uniq
Zużycie pamięci dyskowej
Pracując na wspólnym serwerze, tak jak w przypadku TCS-u, trzeba mieć na względzie
ile nasze pliki zajmują miejsca na dysku. Wprawdzie nasze dyski są spore, ale muszą
przechowywać dane dla wszystkich studentów! By uniknąć sytuacji w której miejsca
zupełnie brakuje, administratorzy wprowadzają limity dla każdego użytkownika. W ten
sposób nawet jeśli ktoś zapełni swoją przestrzeń, nie wpłynie to negatywnie na Twoją
pracę.
Komenda quota podaje informację o ilości zużytej pamięci przez użytkownika, oraz jego
dostępnych limitach.
-g --group
-v --verbose
-s
-q
--human-readable
--quiet
Wyświetla limity dla grupy do której należy użytkownik
Uwzględnia wszystkie dostępne systemy plików,
nawet tam gdzie nie ma limitów
Wyświetla ilość danych w wygodnych jednostkach
Wyświetla informacje tylko gdy limity są przekroczone
Na serwerach tcs limity są określone dla grupy użytkownika a niekoniecznie dla loginu.
Dlatego rekomendujemy używać parametr -g:
0
0
ilość plików
grace
czas na
poprawę
limit
twardy
limit
quota
miękki
limit
aktualne
zużycie
ilość danych
czas na
poprawę
twardy
limit
miękki
limit
aktualne
zużycie
$ quota - sg
Disk quotas for group staff ( gid 50) : none
Disk quotas for group users ( gid 100) : none
Disk quotas for group fuse ( gid 109) : none
Disk quotas for group pdan ( gid 627) :
Filesystem
space quota limit grace files
random . direct :/ exports / home / student
9687 M 8192 M 16384 M 6 days
103
Użytkownik ma prawo przekroczyć miękki limit na krótki okres czasu (tzw. grace period ).
Na przykładzie powyżej miękki limit został przekroczony i pozostało 6 dni by użytkownik
skorygował problem. Ponadto użytkownik może być ponaglany do korekty w inny sposób,
np. poprzez regularny automatyczny e-mail.
Twardy limit nie może zostać przekroczony. Przy każdej operacji która mogłaby naruszyć
ten limit zostanie wywołany błąd tak jakby nie było miejsca na dysku.
Strona 5/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
Limit 0 oznacza, że nie ma żadnego limitu. W przykładzie powyżej, zostały określone
limity 8G (miękki) i 16G (twardy) na ilość danych. Nie ma natomiast limitów na liczbę
plików.
Jeśli ilość wolnego miejsca jest niewielka, trzeba albo znaleźć i usunąć niepotrzebne
pliki, albo je skompresować. Kompresji można dokonać różnymi programami, najbardziej
popularne są gzip i tar. Skompresowane pliki nie są plikami tekstowymi i typowo mają
końcówkę .gz.
gzip <nazwa>
kompresuje <nazwa>, tworząc <nazwa>.gz
gzip -d <nazwa>.gz
dekompresuje <nazwa>.gz
tar czvf <katalog>.tar.gz <katalog> kompresuje <katalog>
tar tzvf <katalog>.tar.gz
listuje skompresowany <katalog>
tar xzvf <katalog>.tar.gz
dekompresuje <katalog>
Pozostałe polecenia
passwd
whoami
who
clear
exit
zmienia hasło użytkownika
wyświetla nazwę aktualnego użytkownika
wyświetla wszystkich użytkowników zalogowanych aktualnie w systemie
czyści ekran terminalu
zamyka powłokę
Ponadto komenda alias pozwala na tworzenie nowych skrótów, wyglądających jak osobne
komendy.
alias < nazwa >= ’ < tekst > ’
Za każdym razem, gdy zostanie wywołana komenda <nazwa>, zostanie ona zastąpiona
treścią <tekst>. Wywołanie komendy alias bez parametrów wypisuje wszystkie aktywne
aliasy.
$ alias la = ’ ls -al ’
$ la
total 12
drwxrwxr - x 3 kecim
drwx - - - - - x 44 kecim
-r - -r - - - - - 1 kecim
-rw - rw -r - - 1 kecim
drwxrwxr - x 2 kecim
$ alias
alias la = ’ ls -al ’
kecim 4096 Sep 22 10:47 .
users 4096 Sep 21 22:09 ..
kecim 100 Sep 22 10:40 plik - admina
kecim
32 Sep 22 10:39 README . txt
kecim 4096 Sep 21 22:17 Srodowisko
Dany alias jest aktywny tylko podczas jednej sesji. Po otwarciu nowej trzeba go ponownie
stworzyć. Na przyszłych zajęciach wyjaśnimy jak zautomatyzować ten proces.
Strona 6/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
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 zdarza się, że 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.
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.
args
SYSTEM
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.
stdin
komenda
stdout
Dla niektórych komend takie 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.
Strona 7/8
Środowisko programisty
Zestaw 1
Semestr zimowy 2016/2017
Kraków, 4-6 października 2016
∗ 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
Możliwe jest też łączenie wejść i wyjść wielu komend za
pomocą potoków (symbol: |). Przykładowo, jeśli chcemy
posortować odwrotnie leksykograficznie pierwszych 25
linijek pliku „in.txt” i zapisać wynik do „out.txt”:
zawartość
aktualnego
katalogu
sprawdzi w systemie jaka jest zawartość aktualnego
katalogu i wypisze wynik w pliku out.txt.
-a -l
ls
out.txt
head -25 < in.txt | sort -r > out.txt
Poprzez sprytne wykorzystanie potoków możemy poradzić sobie
z tak naturalnymi problemami, jak zliczenie niepowtarzających
się linii pliku „p2”:
head
sort < p2 | uniq | wc -l
cat p2 | sort | uniq | wc -l
in.txt
-25
-r
sort
out.txt
Strona 8/8