Lekcja 8
Zarządzanie systemem Unix
Celem zajęć jest zapoznanie słuchaczy z możliwością konfigurowania środowiska pracy użytkownika poprzez definiowanie i modyfikowanie zmiennych, aliasów oraz tworzenie skryptów.
Systemowe środowisko pracy
Środowisko pracy użytkownika w shellu tworzone jest poprzez informacje zawarte w pliku ewidencyjnym /etc/passwd, deskryptory otwartych plików oraz wartości zmiennych predefiniowanych w powłoce lub ustalanych przez użytkownika. Do wartości przypisanych do zmiennych odwołujemy się poprzez nazwę zmiennej poprzedzoną znakiem $ ($zmienna). Istnieją trzy główne typy zmiennych shella:
zmienne specjalne
zmienne środowiska
zmienne programowe (użytkownika).
Zmienne specjalne
Ich wartości przypisywane są w trakcie uruchamiania shella i dostarczają użytkownikowi informacji o procesie powłoki. Zmienne te są własnością shella i nie można ich zmieniać. Najczęściej wykorzystuje się je w programach shellowych do kontrolowania wykonania skryptu.
Zmienna |
Modyfikacja ? |
Opis |
$# |
NIE |
Liczba argumentów skryptu |
$0 |
NIE |
Nazwa skryptu |
$1, $2...$9 |
TAK |
Kolejne argumenty skryptu |
$* |
NIE |
Wszystkie argumenty jako jeden ciąg „$1 $2 ... $9” |
$@ |
NIE |
Wszystkie argumenty jako oddzielne ciągi „$1” „$2” ... |
$- |
NIE |
Opcje shella z polecenia set |
$? |
NIE |
Kod powrotu ostatniego polecenia |
$$ |
NIE |
Numer procesu bieżącego shella |
$! |
NIE |
Numer procesu ostatniego zadania wsadowego |
Zmienne środowiska
Zmienne środowiska wykorzystywane są przez shell do przekazywania danych pomocniczych wykorzystywanych do nadzorowania sesji shella. Użytkownik ma pełen dostęp do tych zmiennych i może je modyfikować za pomocą zwykłej instrukcji przypisania zmienna=wartość. Część zmiennych środowiska nie ma przypisanych wartości i musi to zrobić użytkownik.
Zmienna |
Opis |
CDPATH |
ścieżka poszukiwań dla polecenia cd |
HOME |
Katalog domowy użytkownika |
Nazwa pliku pocztowego użytkownika |
|
PATH |
ścieżka poszukiwań katalogów z poleceniami |
PS1 |
Znak gotowości shella (standardowo $ dla wszystkich i # dla roota) |
PS2 |
Pomocniczy znak gotowości shella |
HISTFILE |
Nazwa pliku z historią poleceń |
HISTSIZE |
Liczba pamiętanych poleceń |
IFS |
Wewnętrzny separator pól dzielący polecenie na części składowe |
PWD |
Bieżący katalog |
EDITOR |
Edytor wykorzystywany do edycji wiersza poleceń |
MAILCHECK |
Czas w sekundach sprawdzania nowo nadesłanej poczty |
TMOUT |
Czas nieaktywności, po którym shell zakończy sesję (sekundy) |
LOGNAME |
Nazwa logowania użytkownika |
TERM |
Tryb pracy terminala |
TZ |
Symbol strefy czasowej |
Zmienne programowe (użytkownika)
Shell umożliwia definiowanie własnych zmiennych użytkownikowi, których zadaniem jest przechowywania wartości potrzebnych podczas przetwarzania skryptu. Nazwy zmiennych mogą być dowolne ale muszą rozpoczynać się literą lub znakiem podkreślenia „_”. W nazwie zmiennej mogą występować dowolne znaki „_ a-z A-Z 0-9”. Shell rozróżnia wielkość liter.
Zmiennej można przypisać wartość wielokrotnie i wielokrotnie można się do niej odwoływać. Należy zwrócić uwagę, że przypisując zmiennej wartość za pomocą operatora „=” nie można stosować spacji pomiędzy znakiem = a nazwą zmiennej oraz jej wartością.
2. Cytowanie
Technika nadzorowania podstawiania wartości zmiennych nazywa się cytowaniem (quoting). Shell rozróżnia cztery sposoby cytowania:
Brak cytowania
Brak cytowania oznacza, że każde słowo oddzielone za pomocą spacji jest interpretowane przez shell.
Apostrofy 'napis'
Cały napis jest przesyłany do polecenia jako jeden argument. Wszystko co jest umieszczone w apostrofach jest chronione. Shell nie interpretuje umieszczonych w apostrofach znaków specjalnych np. * czy ?. Jest to najbardziej restrykcyjny sposób cytowania.
Cudzysłowy ”napis”
Napis umieszczony w cudzysłowach też traktowany jest jako jeden argument, ale shell interpretuje niektóre znaki specjalne. Są to $, \ oraz ` (akcent). Jeżeli zostaną napotkane w ciągu umieszczonym w cudzysłowie shell wykonuje związane z nimi działanie. Wszystkie inne znaki są chronione.
Akcenty `napis`
Polecenie umieszczone w akcentach jest wykonywane przez specjalnie w tym celu wywołany podshell i w to miejsce podstawiany jest uzyskany wynik. Podshell dokonuje analizy polecenia w zwykły sposób, biorąc pod uwagę włączone znaki cytowania. Znaki akcentu są bardzo użyteczne w skryptach, ponieważ sprawiają, że shell uważa wszystko co znajduje się pomiędzy nimi za polecenie, które należy zastąpić jego wynikiem. Mechanizm ten nazywany jest podstawianiem poleceń.
3. Pliki konfiguracyjne
Środowisko użytkownika i shella tworzą pliki, które są przetwarzane podczas otwierania i zamykania sesji Unixa. Kolejność wczytywania plików konfiguracyjnych w poszczególnych shellach przedstawia poniższa tabelka:
Lp |
Bourn |
Korn |
Bash |
C |
1 |
/etc/profile |
/etc/profile |
/etc/profile |
/etc/csh.login |
2 |
$HOME/.profile |
$HOME/.profile |
$HOME/.bash_profile lub $HOME/.bach_login lub $HOME/.profile |
$HOME/.cshrc
|
3 |
|
$HOME/.kshrc |
|
$HOME/.login |
W shellu Korna najpierw wykonywane są polecenia z pliku /etc/profile. Definiowany jest przez administratora systemu i jego zadaniem jest ustanowienie ogólnego środowiska dla wszystkich użytkowników. Te domyślne ustawienia można zmienić lub rozszerzyć za pomocą poleceń umieszczonych w pliku .profile, który znajduje się w katalogu domowym każdego użytkownika. Plik ten jest doskonałym miejscem do umieszczania zmiennych globalnych, własnych aliasów lub skryptów startowych. Jego przeznaczeniem jest ustalenie indywidualnego środowiska pracy dla każdego użytkownika. Najczęściej użytkownik określa w nim swoją ścieżkę dostępu do plików wykonawczych (PATH), ustala maskę praw dostępu (umask), wygląd znaku zgłoszenia shella (PS1), edytor linii komend (EDITOR).
W zmiennej ENV można zdefiniować nazwę dodatkowego pliku, który jest wykonywany zarówno podczas otwierania sesji, jak i podczas uruchamiania nowego shella poleceniem ksh. Powszechnie używana nazwa tego pliku to .kshrc.
4. Skrypty
Shell może być używany za pomocą wiersza poleceń jako interfejs systemu Unix, ale zawiera również konstrukcje programistyczne, pozwalające na powtarzanie ciągu poleceń i zautomatyzowanie ich w skrypcie. W skryptach można wykorzystywać wszystkie poznane komendy, odwoływać się do zmiennych systemowych, definiować własne zmienne. Znak # jest symbolem komentarza, następujące po nim znaki nie są interpretowane przez shell, chyba że jest to pierwszy znak w pierwszym wierszu. Umieszczenie w pierwszej linii skryptu napisu #! /bin/ksh traktowane jest jako nazwa shella, w którym ma być wykonany skrypt. Niektóre systemy Unix i Linux wymagają tej linii do uruchomienia skryptu.
Należy również pamiętać, aby po zapisaniu skryptu w pliku nadać mu uprawnienia wykonywania (execute). Skrypty uruchamia się jak polecenia shella, wpisując ich nazwę.
Prostszą odmianą skryptów są aliasy - nowe komendy zdefiniowane z poleceń systemu Unix. Aliasy stosuje się aby najczęściej wykonywanym poleceniom nadać krótsze lub łatwiej kojarzące się nazwy.
Lista komend
ksh - uruchomienie nowego shella Korna
ksh - uruchamia shell potomny
exit - zakończenie pracy shella
exit - zamyka aktywny shell (w przypadku uruchomienia tylko jednej powłoki komenda ta kończy pracę w systemie Unix)
export - udostępnienie zmiennej we wszystkich procesach powoływanych przez użytkownika czyli zadeklarowanie zmiennej globalnej
export - wyświetlenie wszystkich zmiennych globalnych
export zmienna - przesłanie wyszczególnionej zmiennej do procesów podrzędnych czyli zadeklarowanie jej jako zmienna globalna widoczna w otoczeniu
typeset - ustawienie typu zmiennej
typeset -opcje zmienna=wartość - przypisanie zmiennej określonej typu zgodnie z zastosowanymi opcjami
typeset +opcje zmienna - odebranie zmiennej określonego typu
wybrane opcje:
-i - zmienna typu całkowitego (integer)
-l - zmiana liter na małe
-u - zmiana liter na wielkie
-r - nadanie zmiennej atrybutu tylko do odczytu
-x - zmienne są automatycznie eksportowane do środowiska shella
unset - usunięcie zmiennych shella ze środowiska
unset zmienna - usuwa niepotrzebną zmienną z shella
history - wyświetla zawartość pliku historii wydanych poleceń
history - wyświetlenie listy ostatnio wydanych poleceń
Wydawane przez użytkownika polecenia zapisywane są w pliku .sh_history w katalogu domowym. Można obejrzeć je komendą more .sh_history.
alias - definiuje nazwę zastępczą polecenia
alias nazwa_zastępcza=”polecenia” - zdefiniowanie nowego aliasu o podanej nazwie, który wykonuje wymienione polecenia
unalias - usuwa istniejący alias
unalias nazwa_zastępcza - usunięcie istniejącego aliasu o podanej nazwie
shift - przesunięcie przesłanych do skryptu argumentów w lewo
shift - przesuwa argumenty o jeden w lewo
shift liczba - przesuwa argumenty w lewo o określoną jednostkę
Komenda shift jest niezbędna aby uzyskać dostęp do argumentów o numerach powyżej 9 (patrz zmienne specjalne $1 ÷ $9). Argumenty, które zostaną przesunięte w lewo poza $1, nie są już więcej dostępne. Podczas przesuwania argumentów odpowiednio zmienia się wartość zmiennej $# (ilość argumentów).
Ćwiczenia
Nawiąż połączenie z serwerem solaris.wlodkowic.pl i zaloguj się swoim nazwiskiem i hasłem (patrz lekcja wprowadzająca). System powinien wyświetlić znak zgłoszenia shella Korna - $.
Wykonaj zadania z bieżącej lekcji:
zadeklaruj zmienną imie i przypisz jej Swoje imię
imie=Andrzej Ⴟ
wyświetl wartość zmiennej imie
echo $imie Ⴟ
Andrzej
uruchom shell potomny, sprawdź uruchomione procesy, wyświetl wartość zmiennej imie
ksh Ⴟ
ps -f Ⴟ
masz dwa procesy ksh, są dwa shelle (porównaj PID pierwszego i PPID drugiego)
echo $imie Ⴟ
zmienna imie nie jest widoczna w shellu potomnym
wróć do shella macierzystego i sprawdź zmienną imie
exit Ⴟ
ps -f Ⴟ
echo $imie Ⴟ
w shellu macierzystym zmienna jest zadeklarowana, aby była widoczna w shellach potomnych należy ją wyeksportować.
eksportuj zmienną imie i sprawdź, czy jest widoczna w shellu potomnym, wróć do shella macierzystego
export imie Ⴟ
ksh Ⴟ
echo $imie Ⴟ
Andrzej
exit Ⴟ
podstaw pod zmienna imie nową wartość robert
imie=robert Ⴟ
echo $imie Ⴟ
robert
stara wartość została przesłonięta przez nowe podstawienie
odwołaj zmienną imie i sprawdź to
unset imie Ⴟ
echo $imie Ⴟ
zmienna imie została usunięta z shella
zadeklaruj ponownie zmienną imie ale tylko do odczytu, pisana wielkimi literami
typeset -ru imie=andrzej Ⴟ
echo $imie Ⴟ
ANDRZEJ
spróbuj podstawić do zmiennej imie nową wartość robert
imie=robert Ⴟ
/bin/ksh: imie: is read only
zmienna imie jest tylko do odczytu, nie można zmienić jej wartości
spróbuj usunąć zmienną imie ze środowiska shella
unset imie Ⴟ
/bin/ksh: imie: is read only
zmienna imie jest tylko do odczytu, nie można jej usunąć
wejdź do katalogu /dane/raporty i wyświetl jego zawartość
cd /dane/raporty; ls Ⴟ
zadeklaruj zmienna ilosc i przypisz jej wartość 20
ilosc=20 Ⴟ
echo $ilosc Ⴟ
20
wyświetl komunikat: W magazynie jest $ilosc towarów, wyświetlić raport?
echo W magazynie jest $ilosc towarów, wyświetlić raport? Ⴟ
W magazynie jest 20 towarów, wyświetlić raport1 raport2 raport3 raport4 raport5 raport6 raporty
końcowy znak zapytania potraktowany został przez system jako znak specjalny zastępujący dowolny znak dlatego system wyświetlił nazwy plików, których nazwa zaczyna się od słowa raport i mają w nazwie jeszcze jeden dowolny znak (raport1, raport2, .. raporty)
wyświetl ten sam komunikat ujęty w apostrofy
echo 'W magazynie jest $ilosc towarów, wyświetlić raport?' Ⴟ
W magazynie jest $ilosc towarów, wyświetlić raport?
apostrofy są najbardziej rygorystyczną odmiana cytowania, dlatego komunikat został przepisany w identycznej postaci jak został wprowadzony.
wyświetl ten sam komunikat ujęty w cudzysłowy
echo ”W magazynie jest $ilosc towarów, wyświetlić raport?” Ⴟ
W magazynie jest 20 towarów, wyświetlić raport?
shell interpretuje znajdujący się w cudzysłowie znak $ jako symbol specjalny, ale nie robi tego ze znakiem zapytania
przypisz do zmiennej dzis dzisiejszą datę
dzis=date jest błędne, shell przypisze do zmiennej ciąg date (sprawdź echo $dzis)
aby zmiennej dzis przypisać datę bieżącą należy komendę date wykonać w podshellu i wynik podstawić do zmiennej, umożliwia to cytowanie w akcentach
dzis=`date` Ⴟ
echo $dzis Ⴟ
zmień znak gotowości shella na napis wpisz komende =>
PS1=”wpisz komende =>” Ⴟ
wywołaj shell potomny, sprawdź jaki jest znak zgłoszenia i dlaczego?
ksh Ⴟ
$
zmienna PS1 nie została wyeksportowana
exit Ⴟ
przy pomocy zmiennej systemowej ustaw znak zgłoszenia aby pokazywał bieżący katalog
PS1='$PWD $>' Ⴟ
zdefiniuj pomocniczy znak zgłoszenia shella na napis: co dalej...
PS2=”co dalej...” Ⴟ
sprawdź nowo zdefiniowany znak, wpisz nie dokończoną komendę echo i zatwierdź enterem, powinien pojawić się pomocniczy znak zgłoszenia shella
echo ”tekst Ⴟ
co dalej...
Ctrl +C
wyświetl listę wydanych poleceń
history Ⴟ
more .sh_history Ⴟ
zdefiniuj edytor linii komend na program vi, sprawdź w jaki sposób możesz edytować poprzednio wydane komendy?
EDITOR=vi Ⴟ
naciśnięcie klawisza [Esc] powoduje wywołanie edytora vi do edycji komend
klawisz [k] przywołuje poprzednio wykonane komendy, klawisz [j] przechodzi do następnych, klawisz [h] i [l] przesuwają kursor w linii komend
edycja możliwa jest jak w edytorze vi [i] - wstawianie, [a] - dopisanie, [x] - skasowanie, [r] - zamiana
[Enter] zatwierdza poprawioną komendę i kieruje ją do wykonania przez shell
zadeklaruj ponownie zmienną imie i przypisz jej Swoje imię
[Esc] [k] aż pokaże się komenda imie=Andrzej Ⴟ
echo $imie Ⴟ
zmienna imie znowu jest w środowisku aktywnego shella
dopisz do znaku zgłoszenia nazwę uruchomionego shella i numer komendy
PS1='$PWD (ksh:!) $>' Ⴟ
zdefiniuj alias dir, który wyświetla zawartość katalogu w formie długiej z ukrytymi plikami, sprawdź jego działanie
alias dir=”ls -la” Ⴟ
dir Ⴟ
dir / Ⴟ
zdefiniuj alias dom, który powoduje przejście do Twojego katalogu domowego i wyświetlenie jego zawartości
alias dom=”cd; dir” Ⴟ
dom Ⴟ
usuń alias dom i sprawdź to
unalias dom Ⴟ
dom Ⴟ
ksh: dom: not found
wyświetl zawartość pliku .profile w Twoim katalogu domowym, zrób jego kopię zapasową
more .profile Ⴟ
cp .profile .profile_stare
dopisz w pliku .profile definicje zmiennych i aliasy, aby były dostępne po każdym logowaniu
vi .profile
dopisz te deklaracje, które Ci odpowiadają np. PS1, EDITOR, dir itp.
[Esc] [:] [w] [q] Ⴟ
przy pomocy edytora vi utwórz plik tekstowy, który będzie skryptem wyświetlającym zmienne specjalne shella zgodnie ze wzorem:
echo ”*** Oto zmienne specjalne ***”
echo ”=======================”
echo ”nazwa programu -> $0”
echo ”liczba parametrów -> $#”
echo ”pierwszy parametr -> $1”
echo ”drugi parametr -> $2”
echo ”trzeci parametr -> $3”
echo ”wszystkie parametry -> $*”
echo ”=======================”
vi zmienne Ⴟ
wpisz tekst skryptu
[Esc] [:] [w] [q] [Enter]
dodaj wszystkim użytkownikom systemu prawo wykonywania tego pliku
chmod a+x zmienne Ⴟ
ls -l Ⴟ
wywołaj skrypt z parametrami aa bb cc dd ee
zmienne aa bb cc dd ee Ⴟ
*** Oto zmienne specjalne ***
======================
nazwa programu -> zmienne
liczba parametrów -> 5
pierwszy parametr -> aa
drugi parametr -> bb
trzeci parametr -> cc
wszystkie parametry -> aa bb cc dd ee
======================
dopisz w pierwszej linii skryptu polecenie shift 2, sprawdź działanie skryptu
vi zmienne Ⴟ
[i] shift 2 [Enter]
[Esc] [:] [w] [q] [Enter]
zmienne aa bb cc dd ee
*** Oto zmienne specjalne ***
======================
nazwa programu -> zmienne
liczba parametrów -> 3
pierwszy parametr -> cc
drugi parametr -> dd
trzeci parametr -> ee
wszystkie parametry -> cc dd ee
======================
komenda shift 2 przesuwa parametry o dwa w lewo, co powoduje usunięcie dwóch pierwszych parametrów aa i bb