====== Wstęp ======
===== Trochę historii UNIX-a i .. wolnego oprogramowania =====
1969 pierwszy UNIX z powłoką (//ang. shell//), edytorem tekstu, pisany w kodzie maszynowym na komputery architektury PDP-7 i PDP 9, Ken Thompson, Dennis Richie, Bell Labs, firma AT&T, New Jersey, USA\\
1972 druga edycja UNIX-a zawierająca potoki (//ang. pipe//)\\
1973 jądro systemu w języku C (Dennis Richie) - UNIX staje się przenośny\\
1975 wprowadzenie UNIX-a (szóstej wersji) na uczelnie do zastosowań naukowych, m.in. do Kalifornijskiego Uniwersytetu Berkeley\\
1977 powstaje BSD (Berkeley Software Distribution) - m.in. edytor ex (Bill Joy), kompilator Pascala\\
1983 System V - pierwszy komercyjny UNIX (AT&T)\\
Blokada źródeł UNIX-a, początki ruchu na rzecz wolnego oprogramowania (//ang. open source//)\\
1983 rozpoczęcie pracy nad GNU (Gnu is Not Unix), Richard Stallman (MIT), wszystko przez drukarkę Xerox\\
1983 Richard Stallman (MIT) tworzy Free Software Fundation - celem jest stworzenie wolnego systemu operacyjnego\\
1984 wydanie 4.2BSD zawierający np. TCP/IP (początki internetu)\\
W międzyczasie mnożą się komercyjne jak i darmowe odmiany UNIX-a - brak standardu\\
BSD + System V = Solaris (Sun)\\
1988 specyfikacja POSIX.1 w odpowiedzi Single UNIX Specification\\
1989 pierwsza wersja licencji GNU GPL (Ogólna Publiczna Licencja)\\
1990 na zamówienie MS powstaje Xenix - pierwszy UNIX dla PC\\
1991 Linus Torvalds i jądro Lunixa\\
1992-1994 procesy sądowe AT&T i Novel wstrzymują rozwój kodu z Berkley, jednak na bazie BSD powstają FreeBSD i NetBSD\\
1994 powstaje Red Hat Linux (Linux rozpowszechniany w dystrybucjach)\\
\\
\\
źródło:\\
===== Budowa i własności systemu UNIX =====
Główne cechy systemu Unix:
* wielozadaniowość - system z podziałem czasu, pozwala na uruchamianie wielu procesów jednocześnie
* wielodostępowość - umożliwia pracę z wieloma użytkownikami
Budowa Unixa:
* **jądro** (//ang. kernel//) - niskopoziomowe oprogramowanie obsługujące sprzęt, dostarczające określone usługi dla programów użytkowych (realizuje system plików, planuje przydziału pracy procesora, zarządza pamięcią i urządzeniami zewnętrznymi, inicjuje działanie systemu, zapewnia mechanizmy komunikacji, dostarcza zestawu wywołań systemowych)
* **powłoka** (//ang. shell//) - interpreter poleceń, pozwala na komunikację użytkownika z urządzeniami i procesami, uruchamianie programów i nadzorowanie ich pracą - najpowszechniejsze powłoki to: sh, ksh, csh, tcsh, bash
* biblioteki systemowe
* oprogramowanie
Pliki w Unixie:
* plik jest ciągiem bajtów
* pliki są zorganizowane w postaci drzewa wyrastającego z korzenia ''%%/%%''. Do każdego pliku możemy dostać się podając ścieżkę od korzenia (ścieżka bezwzględna) lub względem bieżącego katalogu (ścieżka względna)
* katalogi też są plikami, zawierają informację o innych plikach (katalogach), które się w nich znajdują. Każdy katalog zawiera plik o nazwie ''%%.%%'' (kropka) będący odniesieniem do tego katalogu oraz plik o nazwie ''%%..%%'' (dwie kropki) będący odnośnikiem do katalogu położonego wyżej
* urządzenia zewnętrzne (drukarki, terminale, dyski itp.) oraz kanały komunikacji międzyprocesorowej reprezentowane są za pomocą plików “specjalnych” umieszczonych w katalogu ''%%/dev%%'')
* działające procesy również dostępne są w postaci plików w katalogu ''%%/proc%%''
* nazwy plików są dowolne, nie dłuższe niż 255 znaków. Pliki których nazwy rozpoczynają się od kropki (np. ''%%.tcshrc%%'') są plikami ukrytymi
* każdy plik jest własnością określonego użytkownika oraz jest skojarzony z pewną grupą użytkowników. Dla każdego pliku istnieją jasno określone uprawnienia dostępu (odczytu, edycji i uruchamiania) dla każdego użytkownika.
* wszystko w UNIXie jest plikiem
Struktura katalogów:
* korzeń drzewa katalogów
* katalog zawierający najważniejsze polecenia systemowe (np. ''%%/bin/ls%%'', ''%%/bin/cp%%'', etc.)
* katalogi domowe użytkowników (np. ''%%/home/marek%%'' to katalog domowy użytkownika ''%%marek%%'')
* najważniejsze biblioteki (np. ''%%/lib/libc.so%%'' - biblioteka języka C, ''%%/lib/modules/%%'' - moduły jądra, itp.)
* katalog domowy administratora systemu
* najczęściej używane miejsce do montowania nośników (systemów plików), np. dyskietek, dysków, płyt cdrom
* globalne pliki konfiguracyjne (np. ''%%/etc/passwd%%'' - lista użytkowników (kont))
* pliki urządzeń (np. ''%%/dev/lp1%%'' - drukarka, ''%%/dev/hda1%%'' - pierwsza partycja głównego dysku)
* pseudosystem plików z informacjami o procesach (np. ''%%/proc/cpuinfo%%'' - inf. dotyczące procesora)
Ścieżka do pliku:
* bezwzględna - od korzenia drzewa\\
przykład: ''%%/usr/share/local/%%''
* względna - poczynając od bieżącego katalogu\\
przykład: ''%%../../usr/share/local/%%''
===== Rozpoczynamy pracę =====
Przed rozpoczęciem pracy w systemie Unix należy posiadać konto, czyli przydzielony identyfikator i hasło dostępu. Każdy użytkownik ma określone prawa dostępu do zasobów systemu. Zasady te ustala administrator (//ang. root//) czyli super użytkownik mający (nieomal) nieograniczoną władzę nad systemem.\\
**Serwery dostępne dla studentów WFAiIS:**
* ''%%ferm.fizyka.umk.pl%%'' - serwer aplikacji dostępny dla studentów (dostęp wyłącznie z sieci lokalnej)
* ''%%ameryk.fizyka.umk.pl%%'' - serwer dostępowy (ssh i pop3)
Regulamin sieci LAN można znaleźć pod adresem\\
**Zdalna sesja w trybie tekstowym.**\\
Logowanie do powłoki linuksowej z systemu Windows możliwe jest za pomocą programu ''%%Putty%%'', który obsługuje bezpieczny protokół ''%%ssh%%''. Po uruchomieniu programu należy w odpowiednim miejscu podać adres serwera ''%%ferm.fizyka.umk.pl%%''. Rozpoczynamy pracę logując się do systemu podając identyfikator (//ang. login//) oraz hasło (//ang. password//) po czym terminal powinien przywitać nas linią zachęty w postaci:\\
''%%student@ferm >%%''\\
Korzystając z powłoki linuksowej (dostępnej np. w środowisku Cygwin) zalogujemy się za pomocą polecenia ''%%ssh%%''.
''%%$ ssh identyfikator@ferm.fizyka.umk.pl%%''\\
Po zakończeniu pracy wydajemy polecenie ''%%logout%%'' lub ''%%exit%%''.\\
**Zdalna sesja w trybie graficznym:**\\
Chcąc uruchomić graficzne aplikacje na zdalnym serwerze można skorzystać z programu ''%%Cygwin%%'' (środowisko linuksowe w systemie Windows). Połączenie X-serwera ze zdalnym serwerem uzyskujemy wydając w powłoce Cygwina polecenie:\\
''%%$ X -query ferm.fizyka.umk.pl :8%%''\\
**Zmiana hasła:**\\
Zmiana hasła na serwerze ''%%ferm%%'' dokonywana jest poprzez formularz dostępny na stronie UCI pod adresem . Na serwerach wydziałowych hasło jest uaktualniane raz na dobę (około godz. 2).\\
**Zasady nadawania hasła:**
* co najmniej 9 znaków, w tym przynajmniej jedna duża litera i znak specjalny lub cyfra
* prZeMIesZanE DUżE i małe litery oraz cyfry i znaki specj@1ne
* nie podawać swoich danych osobistych, daty urodzenia itp.
* nie należy stosować słów które można znaleźć w słowniku wyrazów polskich lub angielskich
* nie używać prostych sekwencji np.: qwerty, 123456
Hasło powinno stanowić pozornie przypadkowy ciąg znaków ale powinno dać się łatwo zapamiętać.\\
Przykłady haseł: ''%%t@Jn3|ha51o%%'' albo ''%%s2Um1_d0kola=la5%%''\\
**Wstępne ustawienia powłoki ''%%tcsh%%'':**\\
Na serwerze ''%%ferm%%'' domyślną powłoką jest ''%%tcsh%%''. Jednak bardziej powszechną i być może wygodniejszą w użytkowaniu jest powłoka ''%%Bash%%''. Jedna z zalet powłoki ''%%Bash%%'' sa ustawienia dopełniania składni i wyświetlania podpowiedzi po wciśnięciu klawisza ''%%TAB%%''. Chcąc uzyskać identyczne zachowanie w powłoce ''%%tcsh%%'' należy zdefiniować zmienną powłoki ''%%autolist%%''. Można zachować te ustawienia umieszczając odpowiedni wpis w pliku konfiguracyjnym ''%%.tcshrc%%'' znajdującym się w katalogu domowym wydając polecenia:
echo "set autolist" >> ~/.tcshrc
source ~/.tcshrc
====== Podstawowe polecenia ======
===== Anatomia polecenia =====
Ogólna postać poleceń wydawanych w powłoce wygląda tak:\\
''%%polecenie [-opcje]… [argumenty]…%%''\\
gdzie ''%%polecenie%%'' jest nazwą programu (polecenia) który chcemy uruchomić (program powinien znajdować się w jednym z katalogów zawartych w zmiennej systemowej ''%%$PATH%%'', jeśli tak nie jest to musimy podać pełną ścieżkę do danego polecenia, np. ''%%/bin/ls%%'')
* **''%%-opcje%%''** to ciąg znaków poprzedzony myślnikiem. Opcje modyfikują działanie programu (polecenia). Na przykład ''%%ls -t%%'' wyświetli listę plików w kolejności posortowanej względem czasu modyfikacji.
* **''%%argumenty%%''** to elementy na których operuje polecenie (np. nazwy plików, ciągi znaków). Na przykład ''%%ls /bin%%'' wyświetli listę plików w katalogu ''%%/bin%%''.
Zawartość nawiasów kwadratowych ''%%[]%%'' jest opcjonalna zaś ''%%…%%'' (wielokropek) oznacza, że poprzednia część polecenia może się powtarzać wielokrotnie\\
Przykład:\\
''%%ls [-la] [katalog]…%%''\\
oznacza, że polecenie ''%%ls%%'' może być modyfikowane za pomocą opcji ''%%-a%%'' lub ''%%-l%%'' i argumentem tego plecenia może być katalog lub lista katalogów oddzielona znakiem spacji.\\
''%%$ ls -l /usr%%''\\
''%%$ ls -a /usr /home /etc%%''\\
''%%$ ls -l -a /etc%%''\\
''%%$ ls -la /home /etc%%''\\
Powyższa notacja używana jest do opisu poleceń oficjalnej dokumentacji.
===== Gdzie szukać pomocy? =====
Pomoc na temat sposobu użycia danego polecenia możemy otrzymać uruchamiając je z dodatkową opcją ''%%-h%%'' lub ''%%--help%%''.\\
Przykład:\\
''%%$ ls —help%%''\\
''%%$ man -h%%''
==== Podręcznik systemowy ====
W systemie znajduje się podręcznik ''%%man%%'' zawierający opis wszystkich dostępnych poleceń i programów, opis funkcji systemowych oraz zainstalowanych bibliotek i wiele innych przydatnych informacji.
wyświetla strony podręcznika (manuala) dotyczące danego polecenia\\
Postać: ''%%man [rozdzial] [opcje] nazwa%%''
[cmd:man]\\
Otrzymujemy opis składni i wszystkich opcji danego polecenia\\
Przykład:\\
''%%$ man ls%%''\\
wyświetli opis polecenia ''%%ls%%'' zawarty w podręczniku man.\\
Program ''%%man%%'' oferuje wiele poleceń ułatwiających poruszanie się po dokumentacji oraz wyszukiwanie wyrażeń. Pomoc na ten temat otrzymamy wciskając ''%%h%%''.
Przeszukuje podręcznik (opisy poleceń) w poszukiwaniu danej nazwy.\\
Postać: ''%%apropos nazwa...%%''
[cmd:apropos]\\
Przykład:\\
''%%$ whatis ls less%%''\\
Wyświetli krótki opis poleceń ''%%ls%%'' i ''%%less%%''.\\
Przeszukuje podręcznik (opisy poleceń) w poszukiwaniu danego słowa (wyrażenia regularnego).\\
Postać: ''%%apropos słowo_szukane%%''
[cmd:apropos]\\
Przykład:\\
''%%$ apropos grep%%''\\
Wyświetli opisy zawierające słowo ''%%grep%%''.\\
Możliwe jest stosowanie wyrażeń regularnych (więcej informacji w rozdziale dotyczących narzędzi tekstowych). Przykład:\\
''%%$ apropos ’^l(..)?s$’%%''\\
Wyświetli wpisy które rozpoczynają się od litery ''%%l%%'', kończą na literą ''%%s%%'' a pomiędzy nimi mogą wystąpić dowolne dwa znaki lub brak znaku. Więc do tego wzoru pasuje zarówno opis polecenia ''%%ls%%'' jak i ''%%less%%''
podręcznik GNU\\
Postać: ''%%info [temat]%%''
[cmd:info]\\
Pomiędzy tematami i zagadnieniami w podręczniku info można poruszać się poprzez odnośniki. Pełna listę możliwych poleceń otrzymamy wciskając ''%%?%%''\\
Przykład:\\
''%%$ info%%''\\
wyświetli spis najważniejszych tematów opisanych w podręczniku\\
''%%$ info coreutils%%''\\
wyświetli rozdział dotyczący podstawowych narzędzi dostarczonych z systemem\\
''%%$ info ls%%''\\
opis polecenia ''%%ls%%''\\
===== Zarządzanie plikami =====
Opis narzędzi służących do zarządzania plikami można znaleźć w dokumentacji systemowej pod hasłem ''%%fileutils%%''.\\
==== Najważniejsze polecenia ====
wyświetla zawartość katalogu\\
Postać: ''%%ls [opcje] [plik…]%%''
[cmd:ls]\\
Przykład:\\
''%%$ ls%%''\\
wyświetli zawartość bieżącego katalogu\\
''%%$ ls /bin%%''\\
wyświetli listę plików w katalogu ''%%/bin%%''\\
Polecenie ''%%ls%%'' może być uruchamiane z wieloma parametrami (zobacz ''%%man ls%%'').\\
Najczęściej używanymi są:\\
''%%-l%%'' wyświetla dokładne informacje o plikach (rodzaj pliku, uprawnienia, nazwę właściciela, datę modyfikacji)\\
''%%-a%%'' wyświetla także pliki ukryte (ich nazwa zaczyna się od kropki)\\
''%%-s%%'' wyświetla dodatkowo rozmiar plików\\
''%%-R%%'' rekurencyjne wyświetlanie zawartości katalogu (wraz z podkatalogami)\\
''%%-t%%'' posortowanie wyniku według czasu modyfikacji pliku\\
''%%-S%%'' posortowanie wyniku według rozmiaru plików\\
Przykład:\\
''%%$ ls -la /etc /home%%''\\
wyświetli dokładną informację o wszystkich plikach w katalogach ''%%/etc%%'' i ''%%/home%%''\\
tworzy katalog\\
Postać: ''%%mkdir [-p] katalog…%%''
[cmd:mkdir]\\
Przykład:\\
''%%$ mkdir nowykatalog%%''\\
utworzy katalog o nazwie ''%%nowykatalog%%''\\
Najważniejsze opcje:\\
''%%-p%%'' pozwala tworzyć “gałęzie” katalogów\\
Przykład:\\
''%%$ mkdir -p kat1/kat2/kat3/kat4%%''\\
utworzy cztery puste katalogi (jeden wewnątrz drugiego)\\
usuwa puste katalogi\\
Postać: ''%%rmdir [-p] katalog…%%''
[cmd:rmdir]\\
\\
zmienia bieżący katalog\\
Postać: ''%%cd [katalog]%%''
[cmd:cd]\\
Przykład:\\
''%%$ cd /usr/bin%%''\\
spowoduje przejście do katalogu ''%%/usr/bin%%''\\
''%%$ cd ~%%''\\
spowoduje powrót do katalogu domowego\\
''%%$ cd ..%%''\\
przejście do katalogu położonego wyżej\\
usuwa pliki\\
Postać: ''%%rm [opcje] plik…%%''
[cmd:rm]\\
Przykład:\\
''%%$ rm dane.txt%%''\\
usunie plik o nazwie ''%%dane.txt%%''\\
''%%$ rm *.txt%%''\\
usunie wszystkie pliki z rozszerzeniem ''%%.txt%%''\\
Najważniejsze opcje:\\
''%%-f%%'' nie pytaj o potwierdzenie podczas usuwania\\
''%%-r%%'' usuń rekurencyjnie, przydatne przy usuwaniu katalogów wraz z zawartością\\
Przykład:\\
''%%$ rm -fr katalog%%''\\
usunie cały ''%%katalog%%''\\
kopiuje pliki i katalogi\\
Postać: ''%% cp plik1 plik2 cp plik... katalog cp -r katalog1... katalog2%%''
[cmd:cp]\\
Przykład:\\
''%%$ cp dane.txt kopia_dane.txt%%''\\
tworzy kopię pliku ''%%dane.txt%%'' o nazwie ''%%kopia_dane.txt%%''\\
''%%$ cp * jakis_katalog/%%''\\
stworzy kopie plików z bieżącego katalogu w katalogu ''%%jakis_katalog%%''\\
Najważniejsze opcje:\\
''%%-r%%'' rekurencyjnie - pozwala kopiować całe katalogi\\
Przykład:\\
''%%$ cp -r /usr/src .%%''\\
kopiuje katalog ''%%/usr/src%%'' do bieżącego katlogu\\
''%%$ cp -r /usr/src nowykatalog%%''\\
kopiuje katalog ''%%/usr/src%%'' do bieżącego katlogu zmieniając jego nazwę na ''%%nowykatalog%%''
przenosi pliki\\
Postać: ''%% mv plik1 plik2 mv plik… katalog%%''
[cmd:mv]\\
Przykład:\\
''%%$ mv dane.txt nowedane.txt%%''\\
zmienia nazwę pliku ''%%dane.txt%%'' na ''%%nowedane.txt%%''\\
''%%$ mv *.c programy/%%''\\
przeniesie wszystkie pliki z bieżącego katalogu posiadające rozszerzenie ''%%*.c%%'' do katalogu ''%%programy%%''\\
wyświetla bieżący katalog\\
Postać: ''%%pwd%%''
[cmd:pwd]\\
\\
''%%/home/student%%''
tworzy dowiązanie do pliku\\
Postać: ''%%ln [opcje] plik nazwa_dowiazania%%''
[cmd:ln]\\
Przykład:\\
''%%$ ln dane.txt lndane.txt%%''\\
tworzy dowiązanie do pliku ''%%dane.txt%%'' o nazwie ''%%lndane.txt%%''\\
Uwaga: każdy plik istnieje dopóki nie usuniemy wszystkich jego dowiązań\\
Najważniejsze opcje:\\
''%%-s%%'' tworzy dowiązanie symboliczne, pozwala na tworzenie dowiązań do katalogów oraz do plików położonych w obrębie innego systemu plików.\\
O liczbie dowiązań do pliku informuje wynik polecenia ''%%ls -l%%'' (druga kolumna)\\
''%%$ ln -s /etc etc_link%%''\\
''%%$ ln /etc/passwd passwd_link%%''\\
''%%$ ls -l%%''
lrwxrwxrwx 1 student stud 5 03-06 20:14 etc_link -> /etc/
-rw-r--r-- 2 student stud 465 2009-04-02 passwd_link
zmienia datę modyfikacji pliku lub tworzy pusty plik\\
Postać: ''%%touch [opcje] plik…%%''
[cmd:touch]\\
\\
wyświetla informację o zawartości pliku\\
Postać: ''%%file [opcje] plik…%%''
[cmd:file]\\
wyświetla rozmiar zajętej przestrzeni dyskowej\\
Postać: ''%%du [opcje] plik…%%''
[cmd:du]\\
Najważniejsze opcje:\\
''%%-b%%'' w bajtach\\
''%%-k%%'' w kilobajtach\\
''%%-m%%'' w megabajtach\\
''%%-h%%'' w czytelnej formie\\
''%%-s%%'' tylko objętość całkowita dla każdego argumentu\\
''%%-c%%'' podsumowanie dla wszystkich plików\\
Przykład:\\
''%%$ du -ms dokumenty%%''\\
wyświetli zajętość w megabajtach katalogu ''%%dokumenty%%''\\
''%%$ du -h -s -c *%%''\\
wyświetli rozmiar wszystkich plików i katalogów w bieżącym katalogu w czytelnej postaci oraz z podsumowaniem\\
Inne przydatne polecenia: stat, mkfifo, lsof, shred, mknod, dd, find, rename
==== Znaki specjalne - dopasowanie nazw plików ====
* ***** dopasowanie dowolnego ciągu znaków
* **?** dopasowanie pojedynczego znaku
* **[lista** ] dopasowanie jednego ze znaków z podanej listy
* **[^lista** ] dopasowanie jednego znaku nie należącego do listy
* **{ciag1,ciag2,…}** dopasowanie jednego z ciągów znaków
**Przykłady:**\\
''%%$ ls *.txt%%''\\
''%%$ cp /etc/p*d %%''\\
''%%$ rm plik?.txt %%''\\
''%%$ ls /etc/[abc]* %%''\\
''%%$ ls /bin/*[a-g] %%''\\
''%%$ rm *.[^a-z]%%''\\
''%%$ ls *.{jpg,txt,mp3}%%''\\
==== Ćwiczenia ====
Obejrzyj zawartość katalogów ''%%/etc%%'', ''%%/proc%%'', ''%%/dev%%'', ''%%/home%%'', ''%%/dev%%'', ''%%/lib%%''.
Utwórz w swoim katalogu domowym katalogi według poniższego schematu. Spróbuj dokonać tego za pomocą jednego polecenia.
.
|-- katalog
| `-- katalog
|-- Moj nowy katalog
|-- nowy_katalog
`-- raz
`-- dwa
|-- cztery
`-- trzy
Do katalogu ''%%katalog%%'' przekopiuj plik ''%%/etc/passwd%%''
Do katalogu ''%%raz/dwa/trzy%%'' skopuj wszystkie pliki z katalogu ''%%/etc%%'' w których nazwach występuje litera ’a’, ’b’ lub ’p’.
W katalogu ''%%nowy_katalog%%'' utwórz pusty plik o nazwie ''%%plik_testowy%%''
W katalogu ''%%katalog%%'' utwórz dowiązanie do pliku ''%%nowy_katalog/plik_testowy%%'' o nazwie ''%%link%%''
Za pomocą edytora tekstu (np. ''%%nano%%'') zmień treść pliku ''%%nowy_katalog/plik_testowy%%'' i zapisz w nim kilka linijek tekstu. Następnie go usuń i sprawdź zawartość pliku ''%%katalog/link%%''.
W katalogu ''%%nowy_katalog%%'' utwórz dowiązanie symboliczne o nazwie ''%%link_symb%%'' do pliku ''%%katalog/link%%''. Zmień zawartość pliku ''%%nomy_katalog/link_symb%%'' i zmień jego zawartość. Następnie usuń plik ''%%katalog/link%%''. Na co wskazuje teraz utworzone dowiązanie symboliczne?
Zmień nazwę katalogu ''%%nowy_katalog%%'' na ''%%stary_katalog%%''
Przenieś katalog ''%%raz%%'' do katalogu ''%%stary_katalog%%'' zmieniając jego nazwę na ''%%jeden%%''
Usuń wszystkie utworzone w tym zadaniu katalogi i pliki.
drwxr-xr-x 3 marek users 4096 sty 5 03:40 .
drwxr-xr-x 9 marek users 4096 sty 4 23:34 ..
-rwxr-xr-x 1 marek users 7312 sty 4 23:54 a.out
-rw-r--r-- 1 marek users 572 sty 4 23:54 main.c
drwxr-xr-x 2 marek users 4096 sty 5 03:40 wynik
W kolejnych kolumnach otrzymujemy następujące informacje:\\
10 znaków określających typ i uprawnienia pliku, ilość dowiązań do pliku, nazwa właściciela, nazwa grupy, rozmiar w bajtach, data i godzina modyfikacji oraz nazwa pliku.\\
| - | rwx | rwx | rwx |
| typ | u | g | o |
| pliku | | | |
| | | | |
Pierwszy znak oznacza typ pliku: ''%%d%%'' to katalog, ''%%-%%'' to zwykły plik.\\
Następne 9 znaków określa uprawnienia pliku (''%%r%%'' - odczyt,''%%w%%'' - zapis, ''%%x%%'' - wykonywanie) odpowiednio dla trzech zbiorów użytkowników: dla właściciela, dla grupy oraz dla wszystkich innych. Z powyższego przykładu wynika więc, że plik ''%%main.c%%'' może być odczytywany przez wszystkich ale jego zawartość może zmieniać tylko właściciel ''%%marek%%''. Plik ''%%a.out%%'' może zostać uruchomiony przez wszystkich (nadane uprawnienie ''%%x%%''). Plik ''%% wynik%%'' jest katalogiem (d) i wszyscy mogą odczytywać jego zawartość (wyświetlać listę plików w katalogu) oraz mają prawa wykonywania (x), czyli mają dostęp do katalogu ale tylko właściciel może zmieniać zawartość tego katalogu (tworzyć lub usuwać pliki w tym katalogu).\\
Poniższe polecenia pozwalają na zmianę uprawnień plików:\\
zmienia właściciela i grupę pliku\\
Postać: ''%%chown [opcje] użytkownik[:grupa] plik…%%''
[cmd:chown]\\
zmienia grupę użytkowników pliku\\
Postać: ''%%chgrp [opcje] grupa plik…%%''
[cmd:chgrp]\\
zmienia prawa dostępu do pliku\\
Postać: ''%%chmod [opcje] prawa plik…%%''
[cmd:chmod]\\
Polecenie służy do ustawiania praw odczytu (r), zapisu (w) i wykonywania (x) pliku. Prawa te można nadać jednemu z trzech zbiorów użytkowników: właścicielowi pliku (u), grupie (g) i całej reszcie (o). Można też zmienić prawa wszystkim użytkownikom (a). Możliwe są trzy operacje: (+) dodanie uprawnień, (-) cofnięcie uprawnień lub (=) zastąpienie starych uprawnień nowymi.\\
Składnia zmiany uprawnień powinna wyglądać tak: ''%%[[ugoa...][+-=][rwx...],...]%%''
Przykład:\\
''%%$ chmod a+r dane.txt%%''\\
nadanie prawa do odczytu dla wszystkich\\
''%%$ chmod u-x *.sh%%''\\
cofnięcie prawa do wykonywania przez właściciela plików o rozszerzeniu ''%%.sh%%''\\
''%%$ chmod ug=r dane.txt%%''\\
nadanie prawa do odczytu przez właściciela i grupę\\
''%%$ chmod ugo=rwx dane.txt%%''\\
nadanie wszystkim uprawnień do odczytu, zapisu i wykonywania pliku - równoważne poleceniu\\
''%%$ chmod a=rwx dane.txt%%''\\
Najważniejsze opcje:\\
''%%-v%%'' wyświetla komunikat o każdym zmienionym uprawnieniu\\
''%%-R%%'' zmień uprawnienia katalogów i całej ich zawartości\\
Przykład:\\
''%%$ chmod -R a+r ~%%''\\
zezwoli wszystkim na możliwość czytania wszystkich plików w domowym katalogu\\
\\
Innym sposobem nadawania uprawnień jest zapis numeryczny, np:\\
''%%$ chmod 703 dane.txt%%''\\
Pierwsza cyfra określa uprawnienia użytkownika, druga - grupy a trzecia - reszty. Wartość (od 0 do 7) oznacza rodzaj uprawnień: wykonywanie (1), zapis (2) lub odczyt (4). W celu nadania kilku uprawnień należy zsumować odpowiednie cyfry. W powyższym przykładzie 7 oznacza nadanie praw do odczytu, zapisu i wykonywania (4+2+1) dla właściciela, 0 oznacza, że grupa nie posiada żadnych uprawnień a 3 odpowiada nadaniu prawa do zapisu i wykonywania (2+1) dla pozostałych użytkowników.\\
==== Ćwiczenia ====
- Sprawdź ustawienia plików ''%%/etc/passwd%%'', ''%%/etc/shadow%%''.
- Sprawdź uprawnienia katalogów domowych pozostałych użytkowników systemu.
- Ustaw uprawnienia swojego katalogu domowego (łącznie z całą zawartością) tak abyś tylko ty miał możliwość przeglądania zawartości.
- Utwórz katalog ''%%~/public_html%%'' i umieść w nim plik o nazwie ''%%index.html%%''. Ustaw uprawnienia tak aby możliwe było wyświetlenie twojej strony domowej. Serwer WWW na serwerze ''%%ferm%%'' jest tak skonfigurowany, że strona znajdująca się w katalogu ''%%public_html%%'' jest dostępna pod adresem ''%%http://www.fizyka.umk.pl/~identyfikator%%''.
===== Procesy =====
System UNIX pozwala na uruchomienie wielu procesów działających równocześnie.\\
Wydanie polecenia zazwyczaj uruchamia proces na pierwszym planie, chcąc uruchomić kolejny program użytkownik musi zaczekać na zakończenie działającego procesu.\\
Istnieje możliwość uruchomienia wielu procesów działających w tle. Powłoka uruchomi proces w tle jeśli na końcu polecenia dodamy ''%%&%%''.\\
Polecenie ''%%sleep%%'' uruchamia proces który nic nie robi i kończy działanie po określonej liczbie sekund.\\
Do działającego procesu można wysłać sygnał aby zakończył swoje działanie albo się zatrzymał.\\
W przypadku działającego na pierwszym planie programu można:\\
- zakończyć działanie procesu wciskając ''%%Ctrl+C%%''\\
- zatrzymać proces wciskając ''%%Ctrl+Z%%'', proces można wówczas przywrócić do działania w tle lub na pierwszym planie za pomocą poleceń powłoki ''%%bg%%'' i ''%%fg%%''.
==== Najważniejsze polecenia ====
podaje informacje o działających procesach\\
Postać: ''%%ps [opcje]%%''
[cmd:ps]. Opcje polecenia ''%%ps%%'' moga byc podawane w różnej formie: poprzedzone myślnikiem (w stylu UNIX) np. ''%%ps -l%%'', bez myślinika (styl BSD), np. ''%%ls aux%%'' lub poprzedzone dwoma myślnikami (styl GNU), np. ''%%ps –help%%''. W razie niepewności zajrzyj do dokumentacji ''%%man ps%%''. Najważniejsze opcje:\\
''%%-l%%'' wyświetla więcej informacji o procesach\\
''%%-f%%'' format ekstra-pełny\\
''%%-A%%'' lub ''%%e%%'' wszystkie procesy\\
''%%-U numer_użytkownika%%'' lub ''%%U%%'', lub ''%%–user%%'' procesy uruchomione przez danego użytkownika\\
''%%u%%'' format zorientowany na użytkownika\\
''%%f%%'' drzewo procesów\\
PID TTY TIME CMD
3873 pts/2 00:00:00 su
3875 pts/2 00:00:00 bash
3893 pts/2 00:00:00 tcsh
3899 pts/2 00:00:00 vim
3904 pts/2 00:00:00 ps
PID (//ang. Process ID//) jest liczbą jednoznacznie identyfikującą proces w systemie. TTY to nazwa terminala z którego zostało uruchomione polecenie ''%%CMD%%''.\\
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1002 3873 3211 0 76 0 - 710 wait pts/2 00:00:00 su
0 S 1002 3875 3873 0 75 0 - 1271 wait pts/2 00:00:00 bash
0 S 1002 3893 3875 0 75 0 - 908 rt_sig pts/2 00:00:00 tcsh
0 T 1002 3899 3893 0 78 0 - 997 finish pts/2 00:00:00 vim
0 R 1002 3945 3893 0 76 0 - 581 - pts/2 00:00:00 ps
Oznaczenia: UID - numer użytkownika, PPID - numer procesu rodzica (procesu z którego wywodzi się dany proces), PRI - priorytet, NI - wartość parametru NICE ustawianego poleceniem ''%%nice%%''
wyświetla drzewo procesów\\
Postać: ''%%pstree [opcje]%%''
[cmd:pstree]\\
Najważniejsze opcje:\\
''%%-p%%'' dodaje numery PID\\
''%%-H PID%%'' wyróżnia podany proces (''%%-h%%'' aktualny proces)\\
zabija proces\\
Postać: ''%%kill [-sygnal] nr_procesu%%''
[cmd:kill]\\
Polecenie wysyła sygnał do procesu, gdy nie sprecyzujemy sygnału wówczas ''%%kill%%'' wysyła sygnał ''%%SIGINT%%'' przerywający działanie procesu\\
Opcja ''%%-l%%'' wyświetla listę sygnałów jakie można przesłać do procesów (więcej na ten temat w dokumentacji ''%%man 7 signal%%'')\\
Najważniejsze sygnały:\\
''%%2 SIGINT%%'' przerwanie procesu (ten sygnał jest wysyłany do procesu gdy wciśniemy ''%%Ctrl+C%%'')''%%9 SIGKILL%%'' sygnał “zabicia” procesu\\
''%%19 SIGSTOP%%'' zawieszenie procesu (''%%Ctrl+Z%%'')\\
''%%18 SIGCONT%%'' wznowienie zatrzymanego procesu\\
''%%$ kill -9 3899%%''\\
wysyła sygnał ''%%KILL%%'' o numerze 9 do podanego procesu\\
''%%$ kill -9 -1%%''\\
wysyła sygnał ''%%KILL%%'' do wszystkich procesów (uwaga: spowoduje wylogowanie, gdyż zamknięty zostanie także proces powłoki)\\
''%%$ kill -SIGSTOP 4008%%''\\
zawiesza działanie procesu\\
''%%$ kill -18 4008%%''\\
wznawia działanie zawieszonego procesu\\
zabija procesy o podanej nazwie\\
Postać: ''%%killall [-s sygnal] nazwa ...%%''
[cmd:killall]\\
Przykład:\\
''%%$ killall sleep%%''\\
wyświetla numery PID procesów pasujących do wzorca\\
Postać: ''%%pgrep [opcje] wyrażenie%%''
[cmd:pgrep]\\
Najważniejsze opcje:\\
''%%-u użytkownik%%'' zawęża wyniki tylko do procesów danego użytkownika.\\
''%%-l%%'' dodaj informację o nazwie procesu\\
Przykład:\\
''%%$ pgrep -u marek sleep%%''\\
wyświetli numery procesów uruchomionych przez użytkownika ''%%marek%%'' zawierających w nazwie ''%%sleep%%''. ''%%$ kill -9 `pgrep -u marek sleep`%%''\\
wyśle syknał ''%%SIGKILL%%'' do procesów uruchomionych przez użytkownika ''%%marek%%'' zawierających w nazwie ''%%sleep%%''.\\
wysyła sygnał do procesów o nazwach pasujących do wzorca\\
Postać: ''%%pgrep [-sygnał] [opcje] wyrażenie%%''
[cmd:pgrep]\\
Polecenie to rozszerza działanie ''%%pgrep%%'' o możliwość wysłania sygnału do pasujących procesów.\\
Przykład:\\
''%%$ pkill -9 -u marek sleep%%''\\
wyśle sygnał ''%%SIGKILL%%'' do procesów uruchomionych przez użytkownika ''%%marek%%'' zawierających w nazwie ''%%sleep%%''.\\
podaje status procesów uruchomionych w bieżącej powłoce\\
Postać: ''%%jobs [-l]%%''
[cmd:jobs]\\
[1]- Done sleep 100
[2]+ Stopped vim
W nawiasie kwadratowym podany jest numer zadania ''%%JID%%'' (//ang. Job ID//), obok stan procesu (zatrzymany, uruchomiony, itp.).\\
Opcja ''%%-l%%'' wyświetla dodatkowo ''%%PID%%'' procesu.\\
uruchamia zawieszone zadanie w tle\\
Postać: ''%%bg [nr_zadania…]%%''
[cmd:bg]\\
uruchamia zadanie na pierwszym planie\\
Postać: ''%%fg [nr_zadania]%%''
[cmd:fg]\\
Przykład:\\
''%%$ f %%''g %2spowodowałoby przeniesienie programu ''%%vim%%'' z poprzedniego przykładu na pierwszy plan
uruchamia program z zadanym priorytetem\\
Postać: ''%%nice -priorytet [opcje] polecenie%%''
[cmd:nice]\\
Przykład:\\
''%%$ nice +19 emacs%%''\\
uruchomi program ''%%emacs%%'' z parametrem ''%%NICE%%'' równym 19. Im większa wartość ''%%NICE%%'' tym mniej zasobów będzie pochłaniało wykonanie procesu, czas jego trwania ulegnie wydłużeniu dając pierwszeństwo procesom z mniejszym priorytetem.
pozwala zwiększyć priorytet działającego procesu\\
Postać: ''%%renice priorytet [nr_procesu] [-u użytkownik]%%''
[cmd:renice]\\
Opcja ''%%-u%%'' pozwala zmienić priorytet procesom uruchomionym przez danego użytkownika.\\
Przykład:\\
''%%$ renice 19 4343 -u student%%''\\
zwiększy priorytet do 19 procesu o numerze ''%%PID%%'' 4343 oraz wszystkim procesom uruchomionym przez użytkownika ''%%student%%''.\\
uruchamia proces o zadanym czasie\\
Postać: ''%%at [-f plik] CZAS%%''
[cmd:at]\\
Polecenie lub lista poleceń do uruchomienia wczytywana jest ze standardowego wejścia, lub po opcji ''%%-f%%'' możemy podać nazwę pliku w który zawarta jest lista poleceń do uruchomienia. ''%%CZAS%%'' może być wyrażony w wielu formach (po szczegóły zajrzyj do podręcznika ''%%man at%%''). Wynik działania polecenia wysyłany jest do skrzynki pocztowej użytkownika. Przykład:\\
''%%$ at 10:21 -f plik%%''\\
spowoduje uruchomienie poleceń zawartych w pliku ''%%plik%%'' o godzinie 10.21\\
''%%$ echo ls | at now +1minutes%%''\\
spowoduje uruchomienie polecenia ''%%ls%%'' dokładnie za minutę\\
wyświetla listę zadań ustawionych do wykonania za pomocą polecenia ''%%at%%''\\
Postać: ''%%atq%%''
[cmd:atq]\\
usuwa z kolejki zadanie o podanym numerze\\
Postać: ''%%atm numer_zadania%%''
[cmd:atm]\\
program zarządzający tabelami demona ''%%cron%%'', który służy do wykonywania zaplanowanych w czasie operacji\\
Postać: ''%%crontab [-e|-l|-r]%%''
[cms:crontab]\\
Opcje:\\
''%%-e%%'' edycja tabeli zadań\\
''%%-r%%'' usunięcie bieżącej tabeli zadań\\
''%%-l%%'' wyświetla bieżącą tabele zadań\\
Tabela zadań powinna zawierać w każdej linii wpis następującej postaci:\\
''%%MINUTY GODZINY DNI MIESIACE DNI_TYGODNIA polecenie%%''\\
gdzie ''%%MINUTY%%'' to liczba z zakresu 0-59, ''%%GODZINY%%'' - liczba z zakresu 0-23, ''%%DNI%%'' - liczba z zakresu 1-31, ''%%MIESIACE%%'' od 1 do 12, ''%%DNI_TYGODNIA%%'' od 1 do 7. Użycie gwiazdki zamiast liczy oznacza dowolną wartość.\\
Przykładowa tabela zadań:
30 18 * * * rm -f ~/tmp
30 0 1 1,6,12 * mail student@fizyka.umk.pl < wiadomosc.txt
Powyższy zapis oznacza, że codziennie o godzinie 18:30 wykonywana jest komenda usuwająca katalog ''%% /tmp%%'', zaś 30 minut po północy w pierwszy dzień stycznia, czerwca i grudnia wysyłany jest za pomocą poczty elektronicznej plik ''%%wiadomosc.txt%%'' do podanego użytkownika. Więcej szczegółów w podręczniku demona ''%%cron%%'' i polecenia ''%%crontab%%''.
**Inne przydatne polecenia:** fuser, iotop, atd, atrun, pidof, lsof\\
**Dodatkowe informacje**\\
W systemach UNIXopodobnych występuje katalog ''%%/proc%%'' zawierający informacje o procesach. Każdy proces jest tu reprezentowany w postaci katalogu o nazwie odpowiadającej numerowi PID. Wewnątrz każdego z nich można znaleźć pliki opisujące status danego procesu, np.: ''%%cmdline%%'' zawiera pełną linie uruchomionego polecenia, ''%%stat%%'' zawiera informacje o stanie procesu (z tego pliku korzysta ''%%ps%%''), ''%%status%%'' - informacje o stanie procesu w bardziej przystępnej formie, itp.\\
Przykład:\\
''%%$ cat /proc/1231/status%%''\\
wyświetli inf. o stanie procesu 1231.
==== Ćwiczenia ====
- Polecenie ''%%xclock -update 1%%'' uruchamia w środowisku graficznym zegar z sekundnikiem. Uruchom zegar na pierwszym planie, zawieś jego działanie za pomocą ''%%Crtl+Z%%'' i wznów działanie w tle.
- Wyślij sygnał ''%%SIGSTOP%%'' do procesu wyświetlającego zegar.
- Uruchom w tle polecenie ''%%xclock -update 1%%''
- Wyślij sygnał ''%%SIGCont%%'' do wstrzymanego procesu wyświetlającego zegar.
- Wyświetl wszystkie uruchomione przez siebie procesy.
- Zabij procesy związane z wyświetlaniem zegarów.
===== Informacje o systemie i użytkownikach =====
podaje datę i czas systemowy\\
Postać: ''%%date [opcje] [format]%%''
[cmd:date]\\
wyświetla kalendarz\\
Postać: ''%%cal [opcje]%%''
[cmd:cal]\\
wyświetla zmienne środowiska\\
Postać: ''%%printenv [zmienna]%%''
[cmd:printenv]\\
wyświetla nazwę terminala\\
Postać: ''%%tty%%''
[cmd:tty]\\
informacje o użytkowniku - GID, UID itp.\\
Postać: ''%%id [opcje] [użytkownik]%%''
[cmd:id]\\
informacje o użytkowniku.\\
Postać: ''%%finger [użytkownik]%%''
[cmd:finger]\\
kim jestem\\
Postać: ''%%whoami%%''
[cmd:whoami]\\
nazwy bieżących grup\\
Postać: ''%%groups [użytkownik]%%''
[cmd:groups]\\
lista zalogowanych użytkowników\\
Postać: ''%%who [opcje]%%''
[cmd:who]\\
informacje o systemie\\
Postać: ''%%uname [opcje]%%''
[cmd:uname]\\
nazwa hosta\\
Postać: ''%%hostname [opcje]%%''
[cmd:hostname]\\
**Inne przydatne polecenia:** users, w, dnsdomianname, chfn\\
===== Wyszukiwanie plików =====
wyszukuje położenie programu w katalogach ze zmiennej ''%%$PATH%%''\\
Postać: ''%%which polecenie%%''
[cmd:which]\\
Przykład:\\
''%%$ which find%%''\\
''%%/usr/bin/find%%''
wyszukuje (wszystkie) położenia plików binarnych, źródłowych i stron podręcznika danego polecenia\\
Postać: ''%%whereis polecenie…%%''
[cmd:whereis]\\
Przykład:\\
''%%$ whereis find%%''\\
''%%find: /usr/bin/find /usr/man/man1/find.1.gz%%''
szuka plików w drzewie katalogów\\
Postać: ''%%find [katalog] [wyrażenie]%%''
[cmd:find]\\
Argumentem polecenia jest ''%%katalog%%'' w którym chcemy odnaleźć plik określony za pomocą ''%%wyrażenia%%''.\\
Najważniejszymi opcjami stosowanymi w wyrażeniu są:\\
''%%-name nazwa_pliku%%'' znajdź plik o podanej nazwie\\
''%%-iname nazwa_pliku%%'' znajdź plik o podanej nazwie (nie rozróżnia wielkości liter)\\
''%%-group nazwa_grupy%%'' plik należy do danej grupy\\
''%%-user nazwa_użytkownika%%'' właścicielem pliku jest użytkownik\\
''%%-type [f|d|l|b]%%'' typ pliku: f - zwykły plik, d- katalog, l - link, b - plik blokowy\\
''%%-atime [+|-]liczba%%'' plik był otwierany określoną liczbę godzin temu\\
''%%-mtime [+|-]liczba%%'' plik był modyfikowany określoną liczbę dni temu\\
''%%-size [+|-]liczba[c|k|M|G]%%'' plik o określonym rozmiarze (c - bajty, k - kilobajty, M - megabajty, G - gigabajty\\
Znak + lub - przed ''%%liczba%%'' oznacza poszukiwanie odpowiednio większej lub mniejszej wartości\\
Przykład:\\
''%%$ find dane/ -name plik.txt%%''\\
szuka pliku ''%%plik.txt%%'' w katalogu ''%%dane%%''\\
''%%$ find ~ -name ’*.jpg’ -user kazik%%''\\
znajdzie wszystkie pliki o rozszerzeniu .jpg w domowym katalogu należące do użytkownika ''%%kazik%%''\\
''%%$ find . -mtime -2%%''\\
znajdzie pliki w bieżącym katalogu które były modyfikowane w ciągu ostatnich dwóch dni\\
''%%$ find /usr -iname ’[a-d]*’ -user root -type f -size -2M%%''\\
wyszuka w katalogu ''%%/usr%%'' pliki o nazwie zaczynającej się od liter a, b, c lub d, których właścicielem jest ''%%root%%'' i które maja rozmiar nie większy od 2 megabajtów\\
W momencie znalezienia pliku spełniającego dane wyrażenie można wykonać określoną akcje (standardowo jest to ''%%-print%%'' czyli wyświetlenie lokalizacji pliku\\
Dodając opcje ''%%-exec%%'' możemy wykonać dowolne polecenie. Takie polecenie musi być zakończone znakami $\backslash$;\\
''%%$ find . -name ’*.txt’ -exec echo znalazłem \backslash;%%''\\
wyświetli komunikat ''%%znalazłem%%'' dla każdego znalezionego pliku\\
Aby wykonać polecenie na znalezionym pliku należy dodać {}, w to miejsce zostanie wstawiona jego nazwa\\
''%%$ find . -name ’*.txt’ -exec rm -f ’{}’ \backslash;%%''\\
spowoduje usuniecie wszystkich znalezionych plików\\
Dużo więcej na temat polecenia ''%%find%%'' można znaleźć w dokumentacji ''%%man%%''\\
===== Inne narzędzia =====
wyświetla linię tekstu\\
Postać: ''%%echo [opcje] ciąg_znaków%%''
[cmd:echo]\\
Przykład:\\
''%%$ echo witaj świecie%%''\\
''%%witaj świecie%%''\\
Polecenie ''%%echo%%'' pomaga zobaczy co zostanie wstawione w miejsce znaków specjalnych *, ?, []\\
''%%$ echo rm -f unix.*%%''\\
''%%rm -f unix.aux unix.dvi unix.gz unix.log unix.out unix.pdf unix.tex%%''
wyświetla w nieskończoność dany ciąg znaków\\
Postać: ''%%yes [ciąg_znaków]%%''
[cmd:yes]\\
oblicza wartość wyrażenia matematycznego\\
Postać: ''%%expr wyrażenie%%''
[cmd:expr]\\
Liczby i operatory muszą być oddzielone spacjami\\
''%%$ expr 2 + 2%%''\\
''%%4%%''\\
''%%$ expr 2 ’*’ 3%%''\\
''%%6%%''\\
Znak * z powodu swojego specjalnego znaczenia musi być zawarty w cudzysłowie\\
wyświetla sekwencję liczb\\
Postać: ''%%seq [opcje] [początek] [krok] koniec%%''
[cmd:seq]\\
Przykład:\\
''%%$ seq 3 2 10%%''\\
''%%3 5 7 9%%''\\
===== Narzędzia sieciowe =====
podaje informacje o hoście\\
Postać: ''%%host [opcje] adres %%''
[cmd:host]\\
Standardowo ''%%host%%'' tłumaczy nazwy domen na adresy IP i na odwrót. Przykład:\\
''%%$ host ferm%%''\\
''%%158.75.5.47%%''\\
''%%$ host 127.0.0.1%%''\\
''%%localhost%%''\\
wysyła pakiet testowy do wybranego hosta\\
Postać: ''%%ping adres %%''
[cmd:ping]\\
Pakiet próbny jest wysyłany aż nie przerwiemy procesu za pomocą Ctrl-C. Przykład:\\
''%%$ ping www.google.pl%%''\\
''%%$ ping 127.0.0.1%%''\\
wyświetla trasę pokonywana do danego hosta\\
Postać: ''%%traceroute [opcje] nazwa_hosta%%''
[cmd:traceroute]\\
Przykład:\\
''%%$ traceroute www.google.com%%''\\
''%% traceroute: Warning: www.google.com has multiple addresses; using 64.233.183.99 traceroute to www.l.google.com (64.233.183.99), 30 hops max, 38 byte packets 1 phys-to-torman (158.75.5.190) 0.242 ms 0.297 ms 0.231 ms 2 * * * 3 war-b2-pos11-0.telia.net (213.248.68.53) 8.753 ms 8.797 ms 8.856 ms 4 ffm-bb1-pos6-3-2.telia.net (213.248.96.21) 33.833 ms 33.679 ms 33.705 ms 5 ffm-b2-link.telia.net (213.248.69.93) 34.974 ms 34.810 ms 34.968 ms 6 google-111945-ffm-b2.c.telia.net (213.248.69.86) 33.758 ms 34.057 ms 33.071 ms 7 72.14.238.119 (72.14.238.119) 51.698 ms 40.944 ms 41.185 ms MPLS Label=162573 CoS=0 TTL=1 S=1 8 64.233.175.246 (64.233.175.246) 44.573 ms 43.413 ms 44.210 ms 9 216.239.43.42 (216.239.43.42) 43.819 ms 45.157 ms 44.443 ms 10 216.239.43.34 (216.239.43.34) 44.962 ms 44.667 ms 64.233.183.99 (64.233.183.99) 44.965 ms %%''
wysyła wiadomość tekstową do użytkownika\\
Postać: ''%%write uzytkownik[@adres]%%''
[cmd:write]\\
program do interaktywnej rozmowy z użytkownikiem\\
Postać: ''%%talk uzytkownik[@adres]%%''
[cmd:talk]\\
zablokowanie możliwości komunikacji poleceniami ''%%talk%%'' i ''%%write%%''\\
Postać: ''%%mesg [n|y]%%''
[cmd:mesg]\\
wysyłanie poczty elektronicznej\\
Postać: ''%%mail uzytkownik[@adres] [-s temat] [-c adres innego adresata]%%''
[cmd:mail]\\
Przykład:\\
''%%$ mail grochu@ferm%%''\\
Chcąc wysłać treść zawartą w pliku ''%%plik_tekstowy%%'' można jego zawartość umieścić w strumieniu wejściowym programu ''%%mail%%'', np:\\
''%%$ cat plik_tekstowy.txt | mail grochu@ferm%%''\\
''%%$ mail grochu@ferm < plik_tekstowy.txt%%''
połączenie ze zdalnym komputerem\\
Postać: ''%%telnet uzytkownik[@adres]%%''
[cmd:telnet]\\
Ze względów bezpieczeństwa dziś rzadko używany, wyparty przez szyfrowane połączenie ''%%ssh%%''.
szyfrowane połączenie ze zdalnym komputerem\\
Postać: ''%%ssh uzytkownik[@adres]%%''
[cmd:ssh]\\
Pozwala na uruchomienie zdalnie powłoki, np: ''%%$ ssh unix@158.75.5.136%%''\\
lub uruchomienie polecenia na zdalnej maszynie, np: ''%%$ ssh unix@158.75.5.136 ls%%''\\
wyświetla listę plików w katalogu domowym zdalnej maszyny\\
połączenie z serwerem FTP pozwalającym na przesyłanie plików\\
Postać: ''%%ftp uzytkownik[@adres]%%''
[cmd:ftp]\\
W Internecie można znaleźć wiele publicznie dostępnych serwerów FTP (logowanie jako użytkownik ''%%anonymous%%''). Na stronie ''%%archie.icm.edu.pl%%'' znajduje się wyszukiwarka ułatwiająca przeszukiwanie takich serwerów.
szyfrowane połączenie z serwerem FTP pozwalającym na przesyłanie plików\\
Postać: ''%%sftp uzytkownik[@adres]%%''
[cmd:sftp]\\
Polecenia dostępne po zalogowaniu można zobaczyć wpisując polecenie ''%%help%%''\\
Najważniejsze polecenia to:\\
''%%get nazwa_pliku%%'' - pobranie pliku\\
''%%put nazwa_pliku%%'' - wysłanie pliku\\
''%%quit%%'' - rozłączenie\\
szyfrowane kopiowanie plików z serwerów ''%%ssh%%'' i ''%%sftp%%''\\
Postać: ''%%scp [-r] uzytkownik[@adres]:plik_zrodlowy plik_docelowy scp [-r] plik_zrodlowy uzytkownik[@adres]:plik_docelowy %%''
[cmd:scp]\\
Składnia i działanie podobne do polecenia ''%%cp%%'' z tą różnicą, że kopiowanie odbywa się pomiędzy maszyna lokalna i zdalna przy użyciu szyfrowanego protokołu.\\
Przykłady:\\
''%%$ scp unix@158.75.5.136:paczka.tar.gz paczka.tar.gz%%''\\
pobranie pliku ''%%paczka.tar.gz%%''\\
''%%$ scp paczka.tzr.gz unix@158.75.5.136:.%%''\\
wysłanie pliku ''%%paczka.tar.gz%%''\\
''%%$ scp -r unix@158.75.5.136:/gry .%%''\\
pobranie całej zawartości (rekurencyjnie) z katalogu ''%%gry%%'' do bieżącego katalogu\\
program do pobierania zasobów stron www i serwerów ftp\\
Postać: ''%%wget [-rkx] adres_strony_lub_pliku %%''
[cmd:wget]\\
Program oferuje wiele możliwości (patrz ''%%man wget%%'')\\
Jedna z ciekawych opcji jest możliwość pobierania całych witryn internetowych z zachowaniem hierarchii katalogów i plików (tworzenie tzw. mirrorów).\\
Przykład:\\
''%%$ wget -m http://www.phys.uni.torun.pl/grochu/unix/materialy/index.html%%''\\
===== Archiwa, kompresja danych =====
Najczęściej używane programy służące do kompresji danych:\\
kompresuje pliki\\
Postać: ''%%gzip [-r] plik %%''
[cmd:gzip]\\
Skompresowane pliki automatyczne uzyskują rozszerzenie ''%%.gz%%''\\
Opcja ''%%-r%%'' pozwala skompresować wszystkie pliki w podanym katalogu (każdy plik kompresowany jest osobno).\\
Przykład:\\
''%%$ gzip archiwum.tar%%''\\
utworzy skompresowany plik o nazwie ''%%archiwum.tar.gz%%''\\
kompresuje pliki i katalogi\\
Postać: ''%%zip [-r] nazwa_archiwum pliki_do_spakowania%%''
[cmd:zip]\\
Tworzy plik o podanej nazwie dodając rozszerzenie ''%%.zip%%'' zawierający skompresowaną zawartość podanych plików.\\
Opcja ''%%-r%%'' pozwala skompresować zawartość całego katalogu.\\
Przykład:\\
''%%$ zip dokumenty *.txt%%''\\
utworzy plik ''%%dokumenty.zip%%'' zawierający skompresowaną zawartość wszystkich plików posiadających rozszerzenie ''%%*.txt%%''\\
''%%$ zip -r konto %%''\\
w pliku ''%%konto.zip%%'' powinna znaleźć się zawartość całego katalogu domowego\\
kompresuje pliki\\
Postać: ''%%bzip2 pliki_do_spakowania%%''
[cmd:zip]\\
Skompresowane pliki otrzymują rozszerzenie ''%%.bz2%%''\\
\\
Aby rozpakować plik utworzony za pomocą jednego z powyższych algorytmów należy wykonać:\\
rozpakowanie pliku ''%%*.gz%%'' oraz ''%%*.tgz%%''\\
Postać: ''%%gunzip [-r] plik %%''
[cmd:gunzip]\\
rozpakowanie pliku ''%%*.zip%%''\\
Postać: ''%%unzip plik%%''
[cmd:unzip]\\
rozpakowanie pliku ''%%*.bz2%%''\\
Postać: ''%%bunzip2 plik %%''
[cmd:bunzip2]\\
Polecenia ''%%gzip%%'' i ''%%bzip2%%'' kompresują pojedyncze pliki dlatego chcąc skompresować kilka plików w jedną całość należy utworzyć archiwum za pomocą programu ''%%tar%%''.
narzędzie do archiwizowania danych\\
Postać: ''%%tar [opcje] pliki %%''
[cmd:tar]\\
Tworząc archiwum pierwszą nazwa pliku podaną jako argument musi być nazwa tego archiwum.\\
Najważniejsze operacje i opcje:\\
''%%c%%'' - stwórz archiwum\\
''%%x%%'' - rozpakuj archiwum\\
''%%l%%'' - wyświetl zawartość archiwum\\
''%%f%%'' - zapisz do pliku (standardowo ''%%tar%%'' pracuje na strumieniach wejściowym i wyjściowym)\\
''%%z%%'' - skompresuj archiwum za pomocą programu ''%%gzip%%''\\
''%%j%%'' - skompresuj archiwum za pomocą ''%%bzip2%%''\\
''%%v%%'' - wyświetla dodatkowe komunikaty\\
\\
Przykłady tworzenia archiwum:\\
''%%$ tar fcv arch.tar kat/%%''\\
utworzy archiwum o nazwie ''%%arch.tar%%'' zawierające zawartość katalogu ''%%kat%%''\\
''%%$ tar fcvz arch.tar.gz *%%''\\
stworzy spakowane (''%%gzip%%'') archiwum o nazwie ''%%arch.tar.gz%%'' zawierające wszystkie pliki i katalogi z bieżącego katalogu\\
''%%$ tar fvcj arch.tar.bz2 plik1.txt plik2.txt%%''\\
utworzy archiwum skompresowane za pomocą ''%%bzip2%%'' o nazwie ''%%arch.tar.bz2%%'' zawierające dwa pliki o nazwach ''%%plik1.txt plik2.txt%%''\\
\\
Otwieranie archiwum:\\
''%%$ tar fx arch.tar%%''\\
''%%$ tar fxvz arch.tar.gz%%''\\
''%%$ tar fxvj arch.tar.bz2%%''\\
====== Edytory tekstu ======
===== Emacs =====
===== Vim =====
===== Inne =====
====== Powłoka tcsh ======
Powłoka jest programem który udostępnia użytkownikowi środowisko pracy. W skład powłoki wchodzą: linia komend, zestaw wbudowanych poleceń, narzędzia obsługi zadań, narzędzia sprawdzające pisownię wpisywanych poleceń. Standardową powłoką użytkową na serwerze ferm jest ''%%tcsh%%''.
===== Najważniejsze funkcje powłoki tcsh =====
===== Dostosowanie powłoki do swoich potrzeb =====
===== Zmienne powłoki =====
===== Aliasy =====
===== Specjalne aliasy powłoki tcsh =====
====== Skrypty - wstęp do programowania w powłoce ======
Skrypty to pliki tekstowe zawierające ciągi instrukcji (po jednej na linię). W odróżnieniu od zwykłych plików tekstowych, skrypty możemy uruchamiać tak jak zwykłe programy. W systemach UNIX/GNU Linux skrypty pozwalają na zautomatyzowanie wielu czynności za pomocą jednego pliku.\\
Przykład prostego skryptu:\\
#!/bin/tcsh
#to jest skrypt ktory wyswietla komunikat
echo "Jestem skryptem"
exit 0
===== Struktura skryptu =====
* w pierwszej linii powinna znajdować się informacja dotycząca powłoki w jakiej ma być interpretowany skrypt\\
''%%#!/bin/tcsh%%'' - skrypt w ''%%tcsh%%''\\
''%%#!/bin/bash%%'' - gdy skrypt napisany jest w powłoce ''%%Bash%%''\\
''%%#!/bin/ah%%'' - gdy skrypt napisany jest w powłoce ''%%sh%%''
* w każdej kolejnej linii możemy umieścić:\\
- lub instrukcję uruchamiającą program\\
- instrukcję uruchamiającą inny skrypt\\
- instrukcję sterującą (np. pętle ''%%while%%'',''%%for%%'', warunek ''%%if%%'', itp.)
* skrypt powinien kończyć się instrukcją ''%%exit%%''
* tekst zawarty po znaku # aż do końca linii jest komentarzem i nie jest interpretowany przez powłokę (z wyjątkiem pierwszej linii skryptu)
===== Uruchamianie skryptu =====
Skrypt korzystający ze składni ''%%tcsh%%'' uruchamiamy wydając polecenie:\\
''%%$ tcsh nazwa_skryptu%%''\\
Analogicznie dla powłoki ''%%sh%%'' i ''%%Bash%%'' wydajemy odpowiednio polecenie\\
''%%$ sh nazwa_skryptu%%''\\
lub\\
''%%$ bash nazwa_skryptu%%''\\
Plikowi tekstowemu zawierającemu skrypt możemy nadać\\
''%%$ chmod +x nazwa_skryptu%%''\\
wówczas skrypt uruchamiamy tak jakby to był program lub polecenie powłoki, wpisując jego nazwę\\
''%%$ nazwa_skryptu%%''\\
Bieżący katalog powonień znajdować się na liście katalogów umieszczonych w zmiennej środowiskowej ''%%$PATH%%'' (w powłoce ''%%tcsh%%'' można wykorzystać także zmienną ''%%$path%%''), w przeciwnym wypadku należy podać ścieżkę do pliku który ma zostać uruchomiony, np.:\\
''%%$ ./nazwa_skryptu%%''\\
Aby dodać bieżący katalog do zmiennej ''%%$PATH%%'' należy wydać w powłoce ''%%tcsh%%'' polecenie\\
''%%$ setenv PATH ${PATH}:.%%''\\
lub w powłoce ''%%sh%%'' lub ''%%Bash%%''\\
''%%$ export PATH=${PATH}:.%%''\\
Więcej na temat zmiennych w powłoce ''%%tcsh%%'' oraz w powłoce ''%%Bash%%'' .
===== Wykrywanie błędów w skrypcie =====
Zarówno powłoka ''%%tcsh%%'' jak i ''%%bash%%'' w przypadku napotkania błędu w składni skryptu przerwa jego działanie wyświetlając stosowny komunikat. Poszukiwanie błędów można ułatwić dzięki opcjom ''%%-v%%'' oraz ''%%-x%%''.\\
Przykład:\\
''%%$ tcsh -v skrypt.sh%%''\\
''%%$ bash -x skrypt.sh%%''\\
Opcja ''%%-v%%'' uruchamia tryb gadatliwy, każda instrukcja skryptu zostanie wyświetlona przed uruchomienia.\\
Opcja ''%%-x%%'' wyświetla kolejne instrukcje dodatkowo wykonując podstawienie aktualnych wartości zmiennych.\\
===== Powłoka sh (Bash) =====
==== Zmienne ====
Zmienne definiuje się używając składni ''%%zmienna=wartosc%%'' lub w przypadku zmiennych liczbowych ''%%let zmienna=liczba%%'', np.\\
''%%$ napis=Ala ma kota%%''\\
''%%$ let wynik=10%%''\\
Zmienne środowiskowe (globalne) tworzymy poleceniem ''%%export%%''.\\
''%%$ export zmienna%%''\\
''%%$ export PATH=$PATH:.%%''\\
Nazwa zmiennej może składać się z dowolnych liter, cyfr (cyfra nie może być pierwszym znakiem nazwy zmiennej) oraz znaku podkreślenia.\\
Wartość umieszczoną w zmiennej wydobywamy umieszczając $ przed nazwą zmiennej\\
''%%$ echo $napis%%''\\
''%%$ Ala ma kota%%''\\
''%%$ echo $HOME%%''\\
''%%$ /home/student%%''\\
''%%$ echo $wynik%%''\\
''%%$ 10%%''\\
=== Tablice ===
W powłoce Bash mamy do dyspozycji tablice jednowymiarowe. Nie muszą one być deklarowane. Do poszczególnych elementów tablicy odwołujemy sie poprzez nawiasy kwadratowe ''%%${zmienna[indeks]}%%''\\
''%%$ kolor[1]=bialy%%''\\
''%%$ kolor[2]=czarny%%''\\
''%%$ kolor[3]=zielony%%''\\
''%%$ echo Kolor pierwszy $kolor[1]%%''\\
''%%$ echo Wszystkie kolory $kolor[*]%%''\\
Tablice indeksowane są liczbami całkowitymi począwszy od zera. Automatyczne przypisanie kolejnych wartości do tablicy uzyskujemy wpisując ''%%zmienna=(wartosc1 wartosc2 ... wartoscN)%%'', np.\\
''%%$ dzien=(poniedzialek wtorek sroda czwartek piatek sobota niedziela)%%''\\
''%%$ echo $dzien[6]%%''\\
''%%$ echo Dni tygodnia: $dzien[8]%%''\\
''%%$ dzien[0]=Monday%%''\\
Liczbę elementów tablicy uzyskujemy wyrażeniem ''%%${#zmienna[*]}%%''\\
''%%$ echo Ilosc dni tygodnia = $#dzien[*]%%''\\
Wyrażenie ''%%${#zmienna[indeks]}%%'' poda ilość znaków zawartych w elemencie tablicy i podanym indeksie.\\
''%%$ echo Slowo $dzien[1] zawiera $#dzien[1] znakow%%''\\
Polecenie ''%%unset zmienna%%'' usuwa podaną zmienną. Chcąc usunąc wybrany element tablicy nalezy wykonać ''%%unset tablica[index]%%''.\\
''%%$ unset kolor%%''\\
''%%$ unset dzien[4]%%''\\
=== Zmienne $, $#, $0, $1 ===
Zmienna ''%%$*%%''$ zawiera listę wszystkich argumentów z jakimi został wywołany skrypt, zmienna ''%%$#%%'' podaje liczbę tych argumentów, zmienna ''%%$0%%'' zawiera nazwę skryptu, zaś zmienne ''%%$1%%'', ''%%$2%%'', ''%%$3%%'', itd. zawierają kolejne argumenty, np.:\\
#!/bin/bash
echo Nazwa skryptu=$0
echo Podales $# argumentow
echo Oto one: $*
echo Argument 1 = $1
echo Argument 2 = $2
==== Operacje arytmetyczne i warunki logiczne ====
Powłoka ''%%tcsh%%'' pozwala na wykonywanie prostych operacji arytmetycznych na liczbach całkowitych za pomocą instrukcji ''%%let%%''.\\
Przykład:\\
''%%$ let suma=2+2%%''\\
''%%$ echo $suma%%''\\
''%%$ 4%%''\\
''%%$ let liczba=$suma*2%%''\\
''%%$ echo $liczba%%''\\
''%%$ 8%%''\\
Składnia polecenia ''%%let%%'' pozwala na używanie zmiennych liczbowych bez konieczności poprzedzania ich znakiem ''%%$%%''.\\
''%%$ let liczba=suma*suma+3%%''\\
''%%$ let suma++%%''\\
Dostępne operatory oraz priorytet ich wykonywania są takie same jak w języku C (Zobacz tabelę [tab:operatory_tcsh]).\\
Równoważne użyciu polecenia ''%%let%%'' jest zastosowanie ''%%(( wyrażenie ))%%''.\\
Przykłady:\\
''%%$ a=$((1+2))%%''\\
''%%$ a=$(($a*$a))%%''\\
''%%$ a=$((a+1))%%''\\
''%%$ ((a++))%%''\\
Proste operacje arytmetyczne można także wykonywać za pomocą instrukcji ''%%expr%%''. Obliczenia o precyzji zmiennopozycyjnej (dla liczb rzeczywistych) można wykonywać za pomocą kalkulatorów ''%%bc%%'' lub ''%%dc%%''.
**Wyrażenia warunkowe** realizowane są za pomocą ''%%[ wyrażenie ]%%'' lub poprzez polecenie ''%%test%%''. Wartością zwracana jest kod (status programu) 0 w przypadku gdy wyrażenie jest prawdziwe lub 1 gdy wyrażenie jest fałszywe. Porównywanie napisów odbywa się za pomocą operatorów ''%%==%%'', ''%%!=%%'', ''%%<%%'' i ''%%>%%''.\\
''%%$ [ $SHELL == /bin/bash ] && echo Uzywasz powloki Bash %%''\\
''%%$ test $USER != root ] && echo Nie jestes administratorem%%''\\
Porównując liczby całkowite należy skorzystać z operatorów ''%%-eq%%'' ((//ang. equal//) - równe), ''%%-ne%%'' ((//ang. not equal//) - nie równe), ''%%-lt%%'' ((//ang. less then//) - mniejsze niż), ''%%-gt%%'' ((//ang. greater than//) - większe niż), ''%%-le%%'' ((//ang. less equal//) - mniejsze równe) i ''%%-ge%%'' ((//ang. greater equal//) - większe równe).\\
''%%$ [ $RANDOM -lt 16384 ] && echo Reszka%%''\\
''%%$ test ‘cat /etc/passwd | wc -l‘ -gt 100 && echo Uzytkownikow jest wiecej niz 100%%''\\
Wyrażenie warunkowe może tez sprawdzać atrybuty plików:\\
''%%-e%%'' - plik istnieje, ''%%-f%%'' jest zwykłym plikiem, ''%%-d%%'' jest katalogiem, ''%%-r%%'' jest plikiem do odczytu, ''%%-w%%'' - jest plikiem do zapisu, ''%%x%%'' - plik można uruchomić.\\
''%%$ [ -e /etc/passwd ] && echo Plik /etc/passwd istnieje %%''\\
''%%$ test -d /etc/passwd && echo Plik /etc/passwd jest katalogiem %%''\\
Dostępne mamy też operatory ''%%&&%%'' (AND), ''%%||%%'' (OR) oraz zaprzeczenie ''%%!%%'' (NOT) pozwalające łączyć wyrażenia warunkowe w bardziej złożone warunki.\\
W takim przypadku złożone wyrażenie logiczne należy umieścić w dodatkowych nawiasach ''%%[]%%''.\\
''%%$ %%''[[ $(($RANDOM%2)) -eq 1 && ! $USER == root ]] && echo Warunek jest spelniony\\
''%%$ test ! -w /etc/passwd || $USER != root && echo Nie masz uprawnien do modyfikcaji /etc/passwd lub nie jestes root-em.%%''\\
Wyrażenia warunkowe znajdują zastosowanie wraz z instrukcją ''%%if%%'' oraz pętlą ''%%while%%'').\\
==== Instrukcje sterujące ====
=== Warunek if ===
Składnia warunku:\\
''%%if %%''//wyrażenie''%%;%%''\\
''%%then%%''\\
//
//instrukcje\\
''%%fi%%''//
\\
Gdy //wyrażenie jest prawdziwe (zobacz wyrażenia warunkowe) wówczas wykonywane są //instrukcje pomiędzy słowem ''%%then%%'' i ''%%fi%%''.\\
Przykład:////
#!/bin/bash
if [ $# -eq 0 ];
then
echo "Nie podałeś żadnych argumentów "
fi
exit 0
Bardziej rozbudowane wyrażenie warunkowe:\\
''%%if %%''//wyrażenie''%%;%%''\\
''%%then%%''\\
//
//instrukcje\\
''%%else%%''\\
//
//instrukcje 2\\
''%%fi%%''//
\\
Instrukcje zawarte w bloku rozpoczynającym się od ''%%else%%'' są wykonywane gdy //wyrażenie nie jest spełnione. Np.://
#!/bin/bash
if [ $# -eq 0 ];
then
echo "Nie podałeś żadnych argumentów. "
echo "Podaj liczbe calkowita "
echo "Sprobuj: $0 liczba"
exit 1
fi
if [ $1 -lt 0 ];
then
echo Liczba $1 jest mniejsza od zera
else
echo Liczba $1 jest wieksza lub równa 0
fi
exit 0
Przykład - skrypt o nazwie ''%%rzut.sh%%'' wyświetlający słowo Orzeł lub Reszka z prawdopodobieństwem 1/2.
#!/bin/bash
if [ $(($RANDOM%2)) -eq 1 ];
then
echo "Reszka"
else
echo "Orzeł"
fi
Przykład - skrypt o nazwie ''%%podglad.sh%%'' który dla danego w argumencie pliku wyświetla jego zawartość za pomocą ''%%less%%'', zaś jeżeli podany argument jest nazwą pliku wówczas wyświetlana jest zawartość tego katalogu.
#!/bin/bash
if [ $# -lt 1 ];
then
echo "Podaj plik lub katalog jako argument."
echo "Uzycie: $0 plik"
exit 1
fi
if [ -f $1 ];
then
less $1
else
if [ -d $1 ];
then
ls -l $1
else
echo "Blad: $1 nie jest plikiem ani katalogiem"
fi
fi
=== Pętla for ===
Pętla ''%%for%%'' wykonuje zadane instrukcje tyle razy ile jest elementów na podanej //liście.//
''%%for%%'' // zmienna ''%%in%%'' //lista;\\
''%%do%%''\\
////
//instrukcje\\
''%%done%%''//
\\
W każdej iteracji kolejny element z //listy jest podstawiany do //zmiennej.\\
Przykład uzycia w linii komend:\\
''%%$ for f in ; do echo Plik $f zajmuje $(du -sb $f) bajtow; done %%''\\
dla każdego pliku w bieżącym katalogu wyświetli komunikat o ilości zajmowanych bajtów. Przykład - skrypt zamieniający w nazwach plików duże litery na małe.////
#!/bin/bash
if [[ $# -eq 0 || $1 == "-h" || $1 == "--help" ]];
then
echo "Uzycie: $0 [-h] plik..."
echo "Zamienia w nazwach podanych plikaow duze litery na male (np. Plik.TXT na plik.txt)."
echo "Opcja -h wyswietla pomoc."
exit 1
fi
for plik in $*
do
if [ -e $plik ];
then
nowy_plik=$(echo $plik | tr '[A-Z]' '[a-z]')
if [ $plik != $nowy_plik ];
then
echo "Zamieniam: $plik na $nowy_plik"
mv $plik $nowy_plik
fi
else
echo "Blad: $plik - nie ma takiego pliku"
fi
done
Powłoka ''%%Bash%%'' umożliwia także użycie pętli ''%%for%%'' znanej z języka C.\\
''%%for ((%%'' // wyrażenie1 ; // warunek ; // wyrażenie2 ''%% ))%%''\\
''%%do%%''\\
//////
//instrukcje\\
''%%done%%''//
Wszystkie //instrukcje są wykonywane dopóki //warunek jest spełniony. Początkowe //wyrażenie1 jest uruchomione tylko raz przed rozpoczęciem pętli, zazwyczaj służy do zainicjowania zmiennych. Końcowe //wyrażenie2 jest wykonywane na końcu każdej iteracji, zazwyczaj używane jest do zwiększenia (lub zmniejszenia) pewnego licznika.\\
Przykład - skrypt wyznaczający silnię:////////
#!/bin/bash
if [[ $# -eq 0 || $1 == "-h" || $1 == "--help" ]];
then
echo "Uzycie: $0 [-h] liczba"
echo "Oblicza silnie podanej liczby."
echo "Opcja -h wyswietla pomoc."
exit 1
fi
silnia=1;
for (( i=2 ; i<=$1 ; i++ ))
do
let silnia=silnia*i;
done
echo "Silnia wynosi $silnia"
Przykład - wielokrotne losowanie kostką:
#!/bin/bash
if [[ $1 == "-h" || $1 == "--help" ]];
then
echo "Rzut kostka"
echo "Uzycie: $0 [-h] liczba"
echo "Wyswietla wynik rzutu kostka powtorzenoge zadana liczbe razy."
echo "Opcja -h wyswietla pomoc."
exit 1
fi
ile=1
if [ $# -gt 0 ]; then ile=$1 ;fi
for (( i=1 ; i<=ile ; i++ )) do
wynik=$(($RANDOM%6+1))
echo $wynik
done
=== Pętla while ===
Składnia pętli ''%%while%%'':\\
''%%while%%'' // warunek\\
''%%do%%''\\
//
//instrukcje\\
''%%done%%''//
Podane //instrukcje są wykonywana dopóki //warunek jest prawdziwy.\\
Przykład - stoper, odlicza sekundy od rozpoczęcia działania skryptu:\\
////
#!/bin/bash
if [[ $1 == "-h" || $1 == "--help" ]];
then
echo "Stoper - po prostu uruchom bez argumentow."
echo "Ctrl+C konczy odliczanie."
echo "Opcja -h wyswietla pomoc."
exit 1
fi
let s=0
while true; do
echo $s
sleep 1
let s++
done
Instrukcja ''%%true%%'' zwraca zawsze wartość logiczną prawda. Analogicznie ''%%false%%'' daje odpowiedź negatywną.\\
=== Instrukcja case ===
Instrukcja ''%%case%%'' pozwala na wykonanie wybranych instrukcji w zależności od wartości przyjmowanej przez pewną zmienną. Działanie bardzo podobne do instrukcji ''%%if%%'' jednak często wygodniejsze w użyciu, zwłaszcza gdy mamy więcej niż dwie możliwości do wyboru.\\
''%%case%%'' // zmienna ''%%in%%''\\
//
//wartość_1''%%)%%''\\
//
//instrukcje 1\\
//
''%%;;%%''\\
//wartość_2''%%)%%''\\
//
//instrukcje 2\\
//
''%%;;%%''\\
…\\
''%%*)%%''\\
//instrukcje\\
//
''%%;;%%''\\
''%%esac%%''
Przykład - skrypt wyświetla menu:\\
#!/bin/sh
while true
do
clear
echo "============================"
echo "[1] Wyświetl dzisiejszą datę"
echo "[2] Wyswietl listę plików w bierzącym katalogu"
echo "[3] Pokarz kalendarz"
echo "[4] Pokarz listę zalogowanych uzytkownków"
echo "[5] Zakończ"
echo "============================"
echo -n "Wybierz liczbę [1-5]: "
read akcja
case $akcja in
1) echo "Dzisiejsza data: `date`"
;;
2) echo "Lista plików w katalogu `pwd`"
ls -l
;;
3) cal ;;
4) echo "Lista zalogowanych" ; who ;;
5) echo "Do widzenia"
exit 0 ;;
*) echo "Blad!!! Proszę wybrać wartość 1,2,3,4, lub 5";
esac
echo "Wciśnij klawisz Enter"
read
done
=== Instrukcja exit ===
Instrukcja ''%%exit%%'' kończy działanie skryptu. Liczba całkowita umieszczona po instrukcji ''%%exit%%'' jest zwracana do powłoki jako wynik działania skryptu. W przypadku poprawnego wykonania skrypt powinien kończyć się wyrażeniem ''%%exit 0%%''. Gdy skrypt nie został wykonany poprawnie wówczas po słowie ''%%exit%%'' wstawiamy dowolną liczbę różną od zera (wartość zwracanej liczby może w ten sposób sygnalizować rodzaj błędu który spowodował niepoprawne wykonanie skryptu). Wartość zwracana po słowie ''%%exit%%'' umieszczana jest w zmiennej ''%%$?%%''.\\
=== Instrukcja read ===
Instrukcja ''%%read%%'' pozwala wczytać linie tekstu do podanej zmiennej.\\
Przykład:
#!/bin/bash
echo Podaj imie i nazwisko
read dane
echo Witaj $dane
Możliwe jet też czytanie tekstu z pliku linia po linii, np.:\\
#!/bin/bash
echo Podaj nazwe pliku do wyswietlenia
read plik
if [ ! -r $plik];
then
echo "Nie moge czytac z pliku $plik"
exit 1
fi
cat $plik | while read linia
do
echo $linia
done
=== Funkcje ===
W powłoce ''%%bash%%'' możliwe jest definiowanie funkcji, czyli wyodrębnionych podprogramów oznaczonych pewną unikatową nazwą.\\
''%%nazwa_funkcji( )%%''\\
{\\
//instrukcje do wykonania\\
//
''%%return%%''\\
''%%}%%''
\\
Funkcja wykonywana jest w momencie gdy pojawi się wywołanie jej nazwy.\\
Przykład:
#!/bin/sh
pomoc()
{
echo "Wyswietla liste i liczbe zalogowanych uzytkonikow"
echo "Opcje:"
echo "-h pomoc"
echo "-l liczba zalogowanych użytkoników"
echo "-w lista zalogowanych użytkoników"
return
}
# lista niepowtarzajacych sie nazw zalogowanych uzytkownikow
lista()
{
users=( `who | cut -f 1 -d ' ' | sort | uniq ` )
return
}
case $1 in
"-h") pomoc ;;
"-l") lista
echo "Liczba zalogowanych uzytkonikow = ${#users[*]} "
;;
"-w") lista
echo "Lista uzytkownikow: ${users[*]}" ;;
*) pomoc ;;
esac
Do funkcji możemy przekazać argumenty dodając je przy wywołaniu po nazwie funkcji. Kolejne argumenty umieszczone są w zmiennych ''%%$1%%'', ''%%$2%%'', ''%%$3%%'', itd. Ilość argumentów dana jest poprzez ''%%$#%%'', lista wszystkich argumentów zawarta jest w zmiennej ''%%$%%'' a zmienna ''%%$0%%'' zawiera nazwe funkcji.
#!/bin/sh
funkcja()
{
echo "Argumenty funkcji $*"
echo "Ilość argumentów funkcji $#"
return 0
}
echo "Argumenty skryptu $*"
echo "Ilość argumentów skryptu $#"
echo Uruchamiam funkcje z argumentami: raz dwa trzy
funkcja raz dwa trzy
echo Uruchamiam funkcje z argumentami będącymi nazwami plików z bierzącego katalogu
funkcja *
exit 0
Zmienne użyte wewnątrz funkcji maja zakres globalny, tzn. ich wartość jest dostępna poza funkcją (np. zmienna ''%%users%%'' z pierwszego przykładu w tym paragrafie). Chcąc ograniczyć czas życia zmiennej wyłącznie do obszaru zdefiniowanego przez funkcję należy zadeklarować zmienną poprzedzając ja instrukcją ''%%local%%''. Używanie zmiennych lokalnych może uchronić przed wieloma trudnymi do wykrycia błędami, więc gdzie tylko jest to możliwe, wewnątrz funkcji należy je stosować.\\
Przykład:
#!/bin/sh
funkcja()
{
local zmienna="Zmienna lokalna"
echo "Jestem wewnątrz funkcji"
echo "zmienna=$zmienna"
return 0
}
zmienna="Zmienna globalna"
echo "Zmienna=$zmienna"
funkcja
echo "Zmienna=$zmienna"
exit 0
===== Powłoka tcsh =====
==== Zmienne ====
Zmienne definiuje się przy pomocy polecenia: ''%%set%%'' (zmienne lokalne), ''%%setenv%%'' (zmienne środowiskowe) lub ''%%@%%'' (zmienne lokalne liczbowe).\\
''%%$ set napis=Ala ma kota%%''\\
''%%$ setenv HOME=/home/student%%''\\
''%%$ @ wynik=10%%''\\
Nazwa zmiennej może zawiać 20 znaków - dowolne litery, cyfry (cyfra nie może być pierwszym znakiem nazwy zmiennej) oraz znak podkreślenia.\\
Wartość umieszczoną w zmiennej wydobywamy umieszczając $ przed nazwą zmiennej\\
''%%$ echo $napis%%''\\
''%%$ Ala ma kota%%''\\
''%%$ echo $HOME%%''\\
''%%$ /home/student%%''\\
''%%$ echo $wynik%%''\\
''%%$ 10%%''\\
Zmienne kasujemy poleceniem ''%%unset%%'' oraz odpowiednio (zmienne środowiskowe) ''%%unsetenv%%''\\
''%%$ unset napis%%''\\
''%%$ unset wynik%%''\\
''%%$ unsetenv HOME%%''\\
Należy pamiętać, że wartości umieszczone w zmiennych są ciągami znaków. Zmienna ''%%$wynik%%'' zawiera napis składający się ze znaków ’1’ i ’0’. Możliwe jest jednak wykonywanie prostych .
=== Tablice ===
Tablice deklarujemy w następujący sposób:\\
''%%$ set dzien=(poniedzialek wtorek sroda czwartek piatek sobota niedziela)%%''\\
''%%$ echo $dzien%%''\\
''%%$ poniedzialek wtorek sroda czwartek piatek sobota niedziela%%''\\
Elementy tablicy numerowane są liczbami naturalny (startując od 1), np.''%%$dzien[3]%%'' odnosi się do trzeciego elementu tablicy ''%%$dzien%%''\\
''%%$ echo $dzien[3] $dzien[5]%%''\\
''%%$ sroda piatek%%''\\
''%%$ echo $dzien[2-4]%%''\\
''%%$ wtorek sroda czwartek%%''\\
''%%$ set dzien[7]=sunday%%''\\
''%%$ echo $dzien%%''\\
''%%$ poniedzialek wtorek sroda czwartek piatek sobota sunday%%''\\
Inny przykład:\\
''%%$ set liczby=( ‘seq 1 10‘)%%''\\
''%%$ echo $liczby%%''\\
''%%$ 1 2 3 4 5 6 7 8 9 10%%''
=== Wyrażenie $#zmienna i $?zmienna ===
Za pomocą wyrażenia ''%%$#zmienna%%'' możemy dowiedzieć się ile elementów zawiera tablica zmiennych, np:\\
''%%$ set dzien=(poniedzialek wtorek sroda czwartek piatek sobota niedziela)%%''\\
''%%$ echo $#dzien%%''\\
''%%$ 7%%''\\
Operator ''%%$?zmienna%%'' zwraca wartość 1 jeśli zmienna jest zadeklarowana - 0 w przeciwnym wypadku, np.:\\
''%%$ echo $?dzien%%''\\
''%%$ 1%%''\\
''%%$ unset dzien%%''\\
''%%$ echo $?dzien%%''\\
''%%$ 0%%''\\
Polecenie ''%%unset%%'' [pol:unset] usuwa zmienną, stąd operacja ''%%$?%%'' w tym wypadku zwraca 0.\\
=== Tablica $argv oraz zmienne $. ===
Zmienna ''%%$argv%%'' jest tablicą zawierającą parametry z jakimi został wywołany skrypt. Np. jeżeli uruchomimy skrypt:\\
''%%$ nazwa_skryptu -n 10 ala%%''\\
wówczas w zmiennej ''%%$argv%%'' umieszczone zostaną wszystkie parametry, odpowiednio: ''%%$argv[1]%%'' zawiera “-n”, ''%%argv[2]%%'' - “10”, ''%%$argv[3]%%'' “ala”. W podobny sposób można używać zmiennych ''%%$1 $2 $3%%'' itd., które również zawierają wartości kolejnych argumentów z wywołania skryptu jednak dodatkowo w zmiennej ''%%$0%%'' zawarta jest nazwa wywoływanego skryptu.\\
\\
Przykład - skrypt ''%%argv.sh%%'':\\
#!/bin/tcsh
set n = $#argv
echo "Liczba argumentów = $n"
echo "Nazwa skryptu: $0"
set i=1
while ( $i <= $n )
echo "Argument $i = $argv[$i]"
set i=`expr $i + 1`
end
exit 0
Uruchomienie skryptu:\\
''%%$ ./argv.sh ala ma kota%%''
Liczba argumentów = 3
Nazwa skryptu: ./argv.sh
Argument 1 = ala
Argument 2 = ma
Argument 3 = kota
Argumenty wywołania skryptu zawarte są także w zmiennej ''%%$%%'' a kolejne argumenty dostępne są w zmiennych ''%%$1%%'', ''%%$2%%'', ''%%$3%%'', itd.
==== Operacje arytmetyczne i warunki logiczne ====
Powłoka ''%%tcsh%%'' pozwala na wykonywanie prostych operacji arytmetycznych za pomocą instrukcji ''%%@%%''.\\
Przykład:\\
''%%$ @ suma = 2 + 2%%''\\
''%%$ echo $suma%%''\\
''%%$ 4%%''\\
''%%$ @ liczba = $suma * 2%%''\\
''%%$ echo $liczba%%''\\
''%%$ 8%%''\\
''%%$ @ suma ++%%''\\
''%%$ echo $suma%%''\\
''%%$ 5%%''\\
Operator ''%%++%%'' zwiększa liczbę zawartą w zmiennej o 1. W ''%%tcsh%%'' mamy do dyspozycji operatory występujące w języku C, ich lista zawarta jest w tabeli [tab:operatory_tcsh]:\\
\\
|l|l|l| operator & opis & przykład\\
\\
$+$ & dodawanie & ''%%@ a = $liczba + 1%%''\\
$-$ & odejmowanie & ''%%@ a = $liczba - 2%%''\\
$/$ & dzielenie & ''%%@ a = $liczba / 2%%''\\
$*$ & mnożenie & ''%%@ a = $liczba * $liczba%%''\\
$\%$& reszta z dzielenia & @ a = $liczba % 2\\
\\
''%%>%%'' & większy od & ''%%$liczba > 3%%''\\
''%%<%%'' & mniejszy od & ''%%$liczba < 3%%''\\
''%%==%%'' & równy & ''%%$liczba == $zmienna %%''\\
''%%!=%%'' & różny od & ''%%$liczba != 2%%''\\
\\
''%%&&%%'' & AND & ''%%$liczba < 3 && $liczba < 7 %%''\\
''%%||%%'' & OR & ''%%$liczba == 1 || $liczba == 2 %%''\\
''%%!%%'' & NOT & ''%%!( $liczba < 2 )%%''\\
\\
$++$ & ''%%@ a = $a + 1%%'' & ''%%@ a ++%%''\\
$--$ & ''%%@ a = $a - 1%%'' & ''%%@ a --%%''\\
$+=$ & ''%%@ a = $a + $liczba%%'' & ''%%@ a += $liczba%%''\\
$-=$ & ''%%@ a = $a - $liczba%%'' & ''%%@ a -= $liczba%%''\\
$*=$ & ''%%@ a = $a * $liczba%%'' & ''%%@ a *= $liczba%%''\\
$\slash=$ & ''%%@ a = $a / $liczba%%'' & ''%%@ a \slash= $liczba%%''\\
[tab:operatory_tcsh]
Wartością wyrażeń zawierających operatory relacji jest 0 (fałsz) gdy wyrażenie nie jest prawdziwe lub 1 (prawda) gdy wyrażenie jest spełnione.\\
Proste operacje arytmetyczne można także wykonywać za pomocą instrukcji ''%%expr%%''. Tak jak w każdym poleceniu argumenty instrukcji ''%%expr%%'' muszą byc oddzielone od siebie pustymi znakami.\\
Przykłady zastosowania:\\
''%%$ set a=‘expr 1 + 1‘%%'' ''%%$ set porownanie=‘expr $a == 2‘%%'' ''%%$ set a=‘expr $a + 5‘%%''
Obliczenia na liczbach zmiennopozycyjnych (rzeczywistych) nalezy wykonywac przy pomocy odpowiednich narzędzi (kalkulatorów).\\
Kalkulator dowolnej precyzji ''%%bc%%'', przykład:\\
''%%$ echo ’1.5 * 3.1’ | bc%%''\\
''%%$ set a=echo 3.14*2’ | bc‘%%''\\
''%%$ set wynik=‘echo scale=2; 1/$a | bc‘%%''\\
Zmienna ''%%scale%%'' w kalkulatorze ''%%bc%%'' określa liczbę miejsc po przecinku w wyświetlanym wyniku.
==== Instrukcje sterujące ====
=== Warunek if ===
Składnia warunku:\\
''%%if ( %%''//wyrażenie''%% ) then%%''\\
//
//instrukcje\\
''%%endif%%''//
\\
Jeśli //wyrażenie jest prawdziwe wówczas wykonywane są //instrukcje zawarte po słowie ''%%then%%''.\\
Przykład:\\
////
#!/bin/tcsh
if( $#argv == 0) then
echo "Nie podałeś żadnych argumentów "
endif
exit 0
Bardziej rozbudowane wyrażenie warunkowe:\\
''%%if ( %%''//wyrażenie''%% ) then%%''\\
//
//instrukcje 1\\
''%%else%%''\\
//
//instrukcje 2\\
''%%endif%%''//
\\
Instrukcje zawarte w bloku rozpoczynającym się od ''%%else%%'' są wykonywane gdy //wyrażenie nie jest spełnione. Np.:\\
//
#!/bin/tcsh
if( $#argv == 0 ) then
echo "Nie podałeś argumentów"
else
echo "Podałeś argumenty: $argv"
endif
exit 0
Za pomocą wyrażenia ''%%if%%'' możemy sprawdzać różne własności plików. Np.:\\
#!/bin/tcsh
if( -e $argv[1] ) then
echo "Plik o nazwie $argv[1] istnieje"
else
echo "Nie ma takiego pliku"
endif
Wyrażenie ''%%-e nazwa_pliku%%'' powoduje sprawdzenie czy plik o danej nazwie istnieje.\\
W analogiczny sposób możemy sprawdzić inne własności plików. Najważniejsze z nich zawarte są w tabeli ([tab:testy])
| -e |plik istnieje |
| -f |plik istnieje i jest zwykłym plikiem |
| -d |plik istnieje i jest katalogiem |
| -r |użytkownik posiada prawo do czytania pliku |
| -w |użytkownik posiada prawo do zmiany zawartości pliku |
| -x |użytkownik posiada prawo do wykonywania pliku |
| -o |użytkownik jest właścicielem pliku |
[tab:testy]
Przykład - skrypt o nazwie ''%%which.sh%%'' poszukuje podanego polecenia w jednym z katalogów zawartych w zmiennej i jeśli go znajdzie to wyświetla pełną ścieżkę do tego polecenia (czyli działa analogicznie do programu ):\\
#!/bin/tcsh
if ( $#argv != 1 ) then
echo "Skrypt określa położenie polecenia"
echo "Skladnia: $0 polecenie"
exit 1
endif
foreach katalog ( $path )
set plik=${katalog}/$argv[1]
if ( -f $plik && -x $plik ) then
echo "Znalazlem: $plik"
exit 0
endif
end
echo "Nie znalazlem"
exit 2
Uruchomienie skryptu:\\
''%%$ ./which.sh finger Znalazlem: /usr/bin/finger%%''\\
''%%$ ./whitch.sh fing Nie znalazlem%%''
Jeszcze bardziej rozbudowane wyrażenie warunkowe:\\
''%%if ( %%''//wyrażenie 1''%% ) then%%''\\
//
//instrukcje 1\\
''%%else if ( %%''//wyrażenie 1''%% ) then%%''\\
////
//instrukcje 2\\
''%%endif%%''//
Przykład:
#!/bin/tcsh
if ( $#argv != 1 ) then
echo "Podaj liczbe calkowita lub -h pomoc"
exit 1
endif
if ( $1 == "-h" ) then
echo "Skrypt demonstruje uzycie zlozonego warunku if."
echo "Dla danej liczby calkowitej dowiesz sie czy jest wieksza, mniejsza czy rowna 0."
else if ( $1 > 0) then
echo "Podales liczbe dodatnia."
else if ( $i < 0 ) then
echo "Podales liczbe ujemna"
else if ($i == 0 ) then
echo "Podales zero."
else
echo Podales argument $1 - nie wiem co z tym zrobic.
endif
exit 0
=== Pętla while ===
Składnia pętli ''%%while%%'':\\
''%%while ( %%''//wyrażenie''%% ) %%''\\
//
//instrukcje\\
''%%end%%''//
\\
Pętla jest wykonywana dopóki spełnione jest //wyrażenie.\\
Przykład - skrypt o nazwie ''%%silnia.sh%%'' liczący silnię://
#!/bin/tcsh
if ( $#argv != 1 ) then
echo "Skrypt oblicza silnie z podanej liczby całkowitej"
echo "Skladnia: $0 liczba"
exit 1
endif
set i=1
set silnia=1
while( $i < $argv[1])
@ i = $i + 1
@ silnia = $silnia * $i
end
echo "Silnia z liczby $argv[1] wynosi $silnia"
exit 0
Uruchomienie skryptu:\\
''%%$ ./silnia.sh 6 Silnia z liczby 6 wynosi 720%%''\\
=== Pętla foreach ===
Pętla ''%%foreach%%'' wykonywana jest dla każdej wartości z zadanej //lisy elementów.//
''%%foreach %%'' //zmienna ( //lista elementów )\\
////
//instrukcje\\
''%%end%%''//
\\
W każdym kroku //zmienna przybiera wartość kolejnego elementu z listy.\\
Przykład - skrypt ''%%home.sh%%'' dla każdego pliku (katalogu) zawartego w katalogu ''%%/home%%'' sprawdza uprawnienia do odczytu:\\
//
#!/bin/tcsh
set pliki=`ls /home`
foreach zmienna ( $pliki )
if ( -r /home/$zmienna ) then
echo "Katalog /home/$zmienna - moge z niego czytac"
endif
end
exit 0
Uruchomienie skryptu:\\
''%%$ ./home.sh Katalog /home/212598 - moge z niego czytac Katalog /home/grochu - moge z niego czytac Katalog /home/pk2-8 - moge z niego czytac %%''\\
=== Instrukcja switch ===
Instrukcja ''%%switch%%'' pozwala na wykonanie wybranych instrukcji w zależności od warości przyjmowanej przez pewną zmienną. Działanie bardzo podobne do instrukcji ''%%if%%'' jednak często wygodniejsze w użyciu.\\
''%%switch ( %%''//zmienna''%% )%%''\\
''%%case%%'' //wartość 1 ''%%:%%''\\
////
//instrukcje 1\\
//
''%%breaksw%%''\\
''%%case%%'' //wartość 2 ''%%:%%''\\
//
//instrukcje 2\\
//
''%%breaksw%%''\\
''%%default:%%''\\
//instrukcje\\
''%%endsw%%''//
Przykład:
#!/bin/tcsh
switch ( $1 )
case "-h" :
echo "Opcja -h wyswietla pomoc. Sprobuj takze opcji -v."
breaksw
case "-v":
echo "Opcja -v wyswietla ten oto komunikat."
breaksw
default:
echo "Podales nieobslugiwana opcje $1"
endsw
=== Instrukcja skoku goto ===
Instrukcja ''%%goto%%'' powoduje przeskoczenie do linii skryptu oznaczonego pewną ''%%etykietą%%'' pomijając wszystkie pośrednie instrukcje\\
''%%goto%%'' ''%%etykieta%%''\\
//instrukcje 1\\
''%%etykieta:%%''\\
//
//instrukcje 2//
\\
Wszystkie //instrukcje 1 zostaną pominięte.\\
Przykład - skrypt ''%%goto.sh%%'':\\
//
#!/bin/tcsh
if ( $#argv == 0 ) then
goto blad
endif
echo "Podales nastepujace argumenty wywolania sktyptu:"
echo "$argv"
echo "Milego dnia"
exit 0
blad:
echo "Nie podales argumentow - Nastapil skok do etykiety blad"
exit 1
Uruchomienie skryptu:\\
''%%$ ./goto.sh pewien argument Podales nastepujace argumenty wywolania sktyptu: pewien argument Milego dnia %%''\\
''%%$ ./goto.sh Nie podales argumentow - Nastapil skok do etykiety blad%%''\\
=== Instrukcja exit. ===
Instrukcja ''%%exit%%'' kończy działanie skryptu. Liczba całkowita umieszczona po instrukcji ''%%exit%%'' jest zwracana do powłoki jako wynik działania skryptu. W przypadku poprawnego wykonania skrypt powinien kończyć się wyrażeniem ''%%exit 0%%''. Gdy skrypt nie został wykonany poprawnie wówczas po słowie ''%%exit%%'' wstawiamy dowolną liczbę różną od zera (wartość zwracanej liczby może w ten sposób sygnalizować rodzaj błędu który spowodował niepoprawne wykonanie skryptu). Wartość zwracana po słowie ''%%exit%%'' umieszczana jest w zmiennej ''%%$?%%''.\\
Przykład - skrypt ''%%exit.sh%%'':
#!/bin/tcsh
if ( $#argv == 0 ) then
echo "Podaj nazwe pliku jako argument"
exit 1
endif
if ( -f $argv[1] ) then
echo "Ok, plik $argv[1] istnieje"
exit 0
else
echo "Blad, plik $argv[1] nie istnieje"
exit 2
endif
Uruchomienie skryptu:\\
''%%$ ./exit.sh Podaj nazwe pliku jako argument%%''\\
''%%$ echo $? 1%%''\\
''%%$ ./exit.sh pewienplik Blad, plik pewienplik nie istnieje%%''\\
''%%$ echo $? 2%%''\\
''%%$ ./exit.sh /bin/ls Ok, plik /bin/ls istnieje%%''\\
''%%$ echo $? 0%%''\\
===== Przykłady =====
znajdują się przykładowe skrypty w ''%%tcsh%%''.
====== Indeks polecen ======
- Przeszukuje podręcznik (opisy poleceń) w poszukiwaniu danego słowa (wyrażenia regularnego).\\
- usuwa z kolejki zadanie o podanym numerze\\
- wyświetla listę zadań ustawionych do wykonania za pomocą polecenia ''%%at%%''\\
- uruchamia proces o zadanym czasie\\
- uruchamia zawieszone zadanie w tle\\
- rozpakowanie pliku ''%%*.bz2%%''\\
- kompresuje pliki\\
- wyświetla kalendarz\\
- wyświetla zawartość plików\\
- zmienia bieżący katalog\\
- zmienia grupę użytkowników pliku\\
- zmienia prawa dostępu do pliku\\
- zmienia właściciela i grupę pliku\\
- porównuje pliki znak po znaku\\
- kopiuje pliki i katalogi\\
- program zarządzający tabelami demona ''%%cron%%'', który służy do wykonywania zaplanowanych w czasie operacji\\
- Wypisuje wybrane fragmenty linii\\
- podaje datę i czas systemowy\\
- znajduje różnice pomiędzy plikami\\
- wyświetla rozmiar zajętej przestrzeni dyskowej\\
- wyświetla linię tekstu\\
- oblicza wartość wyrażenia matematycznego\\
- uruchamia zadanie na pierwszym planie\\
- wyświetla informację o zawartości pliku\\
- szuka plików w drzewie katalogów\\
- informacje o użytkowniku.\\
- połączenie z serwerem FTP pozwalającym na przesyłanie plików\\
- wyświetla linie pasujące do wzorca\\
- nazwy bieżących grup\\
- rozpakowanie pliku ''%%*.gz%%'' oraz ''%%*.tgz%%''\\
- kompresuje pliki\\
- wyświetla początek pliku\\
- nazwa hosta\\
- podaje informacje o hoście\\
- informacje o użytkowniku - GID, UID itp.\\
- podręcznik GNU\\
- podaje status procesów uruchomionych w bieżącej powłoce\\
- zabija procesy o podanej nazwie\\
- zabija proces\\
- wyświetl zawartość pliku strona po stronie\\
- tworzy dowiązanie do pliku\\
- wyświetla zawartość katalogu\\
- wysyłanie poczty elektronicznej\\
- wyświetla strony podręcznika (manuala) dotyczące danego polecenia\\
- zablokowanie możliwości komunikacji poleceniami ''%%talk%%'' i ''%%write%%''\\
- tworzy katalog\\
- wyświetla zawartość pliku strona po stronie\\
- przenosi pliki\\
- uruchamia program z zadanym priorytetem\\
- wyświetla numery PID procesów pasujących do wzorca\\
- wysyła pakiet testowy do wybranego hosta\\
- wysyła sygnał do procesów o nazwach pasujących do wzorca\\
- wyświetla zmienne środowiska\\
- podaje informacje o działających procesach. Opcje polecenia ''%%ps%%'' moga byc podawane w różnej formie: poprzedzone myślnikiem (w stylu UNIX) np. ''%%ps -l%%'', - wyświetla drzewo procesów\\
- wyświetla bieżący katalog\\
- pozwala zwiększyć priorytet działającego procesu\\
- usuwa puste katalogi\\
- usuwa pliki\\
- szyfrowane kopiowanie plików z serwerów ''%%ssh%%'' i ''%%sftp%%''\\
- Edytor strumieniowy\\
- wyświetla sekwencję liczb\\
- szyfrowane połączenie z serwerem FTP pozwalającym na przesyłanie plików\\
- sortuje zawartość pliku tekstowego\\
- szyfrowane połączenie ze zdalnym komputerem\\
- wyświetla koniec pliku\\
- program do interaktywnej rozmowy z użytkownikiem\\
- narzędzie do archiwizowania danych\\
- czyta standardowe wejście i przesyła je na standardowe wyjście oraz do pliku.\\
- połączenie ze zdalnym komputerem\\
- zmienia datę modyfikacji pliku lub tworzy pusty plik\\
- wyświetla trasę pokonywana do danego hosta\\
- Zamienia znaki wczytane ze standardowego wejścia.\\
- wyświetla nazwę terminala\\
- informacje o systemie\\
- rozpakowanie pliku ''%%*.zip%%''\\
- liczy ilość znaków, słów i linii w pliku\\
- program do pobierania zasobów stron www i serwerów ftp\\
- Przeszukuje podręcznik (opisy poleceń) w poszukiwaniu danej nazwy.\\
- wyszukuje (wszystkie) położenia plików binarnych, źródłowych i stron podręcznika danego polecenia\\
- wyszukuje położenie programu w katalogach ze zmiennej ''%%$PATH%%''\\
- kim jestem\\
- lista zalogowanych użytkowników\\
- wysyła wiadomość tekstową do użytkownika\\
- wyświetla w nieskończoność dany ciąg znaków\\
- kompresuje pliki i katalogi\\
99 A bib entry. Another bib entry.