Unix-wiadomości podstawowe
Unix Time-Sharing System (pisane również jako UNIX, choć nie jest to skrót - nazwa "UNIX" jest kalamburem określenia MULTICS, który był wzorem dla Uniksa) to system operacyjny napisany w 1969 w Bell Labs (UNIX System Laboratories, USL) przez Dennisa Ritchie i Kena Thompsona, i rozwijany później w bardzo dynamiczny sposób, co zaowocowało powstaniem wielu odmian i implementacji. Więcej w artykule Historia systemu operacyjnego Unix.
Nazwa UNIX jest zastrzeżonym znakiem handlowym Open Group, przemysłowego konsorcjum zajmującego się standaryzacją rodziny kompatybilnych systemów. Oryginalny kod źródłowy należy do firmy Santa Cruz Operations (SCO). USL stanowią dziś część Lucent Technologies (wcześniej należały także do HP).
Dziś Unix - choć jest nazwą zastrzeżoną dla Open Group - stał się synonimem całej rodziny systemów wywodzących się od pierwotnego pnia lub klonów kompatybilnych ze zestandaryzowanymi normami (POSIX, Single UNIX Specification): GNU/Linux, IBM OS/390, GNU/Hurd. W obrębie Uniksów wywodzących się z pierwotnego wydania wyróżnia się dwie gałęzie: pochodne Systemu V oraz rodzinę BSD.
Z Uniksa wywodzi się wiele bardzo ważnych dla informatyki technologii. Są to m.in.: TCP/IP, rekursywny system plików, NFS, pamięć stronicowa, DNS, poczta elektroniczna, FTP.
Historia UNIX
Narodziny
Pierwsza wersja systemu operacyjnego Unix powstała w Bell Labs firmy AT&T w stanie New Jersey w 1969 na komputery architektury PDP-7 i PDP-9 firmy DEC. Jej głównymi autorami byli Ken Thompson i Dennis Ritchie. Początkowy cel stworzenia nowego systemu operacyjnego został osiągnięty i autorzy rozpoczęli prace nad drugą wersją systemu na komputery PDP-11. Tę wersję uruchomiono w 1971 roku. W tym czasie ukazał się Unix Programmer's Manual, który był de facto opisem ówczesnego Uniksa. Drugie wydanie systemu Unix pojawiło się w 1972 roku, w którym wprowadzono pojęcie potoku łączącego procesy. Minikomputery PDP-11 uzyskały wielką popularność i wraz z nimi także Unix. Dlatego wkrótce napisano trzecią wersję systemu operacyjnego Unix.
Autorzy zrezygnowali z pisania systemu w asemblerze i przenieśli całość kodu do stworzonego przez Dennisa Ritchie wysokopoziomowego języka C, co zaowocowało przenośnością systemu.
W roku 1974 Ritchie i Thompson opublikowali artykuł o Uniksie w Communications of the Association for Computing Machinery. Opisano w nim strukturę i sposób jego działania. W 1978 roku wydano specjalne wydanie Bell System Technical Journal nt. Uniksa
Popularyzacja
1975 - Unix Szóstego Wydania - inaczej Wersja Szósta - rozprowadzana nieodpłatnie w uczelniach dla zastosowań akademickich. Przyczyniło się to do gwałtownego rozwoju systemu, powstawania poza AT&T rozszerzeń i oprogramowania. Legendą tego okresu stała się napisana przez profesora Uniwersytetu Nowej Południowej Walii w Australii, Johna Lionsa tzw. Lions Book zawierająca pełny kod V.6 wraz z komentarzem wers po wersie.
Unix szybko zadomowił się w Uniwersytecie Kalifornijskim Berkeley, gdzie został przeniesiony na zastępującą PDP-11 architekturę VAX. Pierwsza wersja wydaną na minikomputery VAX była dostępna jako część Third Berkeley Software distribution, czyli 3BSD.
W 1978 ukazała się wersja 7 (Version 7) - była pierwszą szeroko dostępną, choć AT&T nie zapewniał obsługi i serwisu. Jej zestaw funkcji i programów był aż do czasu ukazania się specyfikacji IEEE i POSIX główną bazą unifikującą rodzące się różne odmiany Uniksa.
Jednym z ważniejszych wydarzeń we wczesnej historii systemu Unix był projekt agencji DARPA przyjęcia jednego systemu operacyjnego na wszystkich komputerach ARPANET. DARPA zdecydowała że tym systemem będzie wersja Berkeley systemu Unix. W ramach pierwszego kontraktu, który trwał w latach 1981-1982, powstał system 4BSD oraz 4.1BSD. Sukces zaowocował kolejnym dwuletnim kontraktem, którego owocem był 4.2BSD, będący pierwszym systemem operacyjnym zawierającym obsługę TCP/IP.
Ekspansja
Wraz z początkiem lat 80-tych AT&T zdecydowała się na komercjalizację Uniksa. W 1980 roku licencję na rozwijanie jego kodu sprzedano firmie Santa Cruz Operations, która na zlecenie Microsoftu, miała przygotować Xenix, jego wersję Uniksa. W 1983 roku ukazała się pierwsza wersja komercyjna Uniksa z AT&T, System V.
Wraz z komercjalizacją AT&T przestała udostępniać kod źródłowy systemu poza licencjami komercyjnymi. Spowodowało to protesty wśród wielu inżynierów akademickich (UCB, MIT), którzy do tej pory pisali własne rozszerzenia systemu i uczestniczyli w jego rozwoju (vide: BSD). Blokada nałożona na kod stała się przyczyną powstania na bazie społeczności użytkowników i niezależnych twórców Uniksa ruchu wolnego oprogramowania. Założona w 1983 roku przez Richarda Stallmana z MIT Free Software Foundation postawiła sobie za cel stworzenie wolnego systemu uniksowego bez kodu pochodzącego z AT&T.
W przeciągu lat 80-tych powstało mnóstwo komercyjnych wersji systemu, ambicją większości firm informatycznych stało się posiadanie własnej odmiany Uniksa. Większość tych projektów bazowała na kodzie AT&T (SCO Xenix, SGI IRIX, DEC Ultrix i in. ), inne rozwijane były w oparciu o wolnodostępny kod BSD (SunOS, NeXTStep) lub innych projektów akademickich, np. Mach (NeXTStep), niektóre łączyły cechy obu gałęzi lub ewoluowały z jednej do drugiej (odpowiednio IBM AIX i HP-UX). W tym czasie na Uniwersytecie Berkeley w pracowniach CSRG cały czas rozwijano BSD.
Unifikacja
Rozdrobnienie systemu na różne wydania i izolacja zespołów programistycznych szybko spowodowały kłopoty ze zgodnością poszczególnych odmian, co zaowocowało staraniami o standaryzację rozwiązań, wywołań i funkcji. Zapotrzebowanie to próbowało spełniać konsorcjum X/Open Company, które realizowało świeżo powstałą ideę open system.
W 1988 roku Sun i AT&T zainicjowały związek, którego wynikiem było najpierw powstanie konsorcjum Unix International oraz wzorcowego systemu SVR4, który łączył zalety SysV i BSD - potem w oparciu o niego powstawały nowy Unix Suna, Solaris (1991) oraz kolejne wersje systemów SCO, m. in. Xeniksa. Konkurencyjni wobec duumwiratu producenci zawiązali Open Software Foundation (OSF), pod auspicjami której ukazał się z czasem ekumeniczny OSF/1, silnie bazujący na BSD. W 1988 roku opublikowano specyfikację POSIX.1 - stanowiącą podstawę tego, co nazywamy Uniksem.
Rewolucja
Wkrótce z początkiem lat 90-tych wojujące frakcje stanęły w obliczu opartego o Internet gwałtownego rozwoju wolnych systemów uniksowych. W 1991 roku Linus Torvalds zaanonsował prace nad jądrem o nazwie Linux, które w połączeniu z narzędziami GNU z FSF stworzyło kompletny uniksopodobny system operacyjny. AT&T a potem Novell, który kupił (22 grudnia 1992) prawa do Uniksa, próbowały przy pomocy procesu sądowego (1992-1994) powstrzymać rozwój systemów pisanych w oparciu o niezmiennie wolnodostępny kod z CSRG Berkeley. Pozew zahamował rozwój gałęzi BSD, powodując pośrednio wycofanie się CSRG z dalszych prac nad kodem oraz porzucenie budowanego na nim otwartego projektu 386BSD. Jednak rok 1993 to wyłonienie się na bazie ostatniego wydania BSD4.4 i porzuconego kodu 386BSD dwóch nowych, wolnych projektów FreeBSD i NetBSD. (więcej: Historia BSD)
Novellowi nie udało się skutecznie połączyć dwóch udanych projektów: swych usług sieciowych i Uniksa. W 1993 roku ukazała się ostatnia wersja SysV, znana jako SVR4.2MP, wcześniej firma przekazała prawa do przydzielania marki Unix oraz regulowania Single UNIX Specification (SUS) organizacji X/Open, która dwa lata później rozpoczęła program standaryzacji, UNIX 95. W tym samym roku Novell zdecydował się sprzedać kod UnixWare - pod taką nazwą sprzedawał System V - dla SCO a dawne Bell Labs Hewlett-Packardowi.
W 1996 z połączenia OSF i X/Open powstało Open Group, które przyznaje prawo do posługiwania się nazwą Unix w odniesieniu do systemów komputerowych oraz opiekuje się SUS.
W 1997 roku ukazała się druga wersja SUS - pierwsza publicznie dostępna (wprowadzała 64-bitowość, wątki), a w 2001 trzecia integrująca POSIX z rozszerzeniami przemysłowymi.
Przełom tysiącleci i 30-lecie Uniksa to gwałtowny rozwój wolnych systemów i wypieranie przez nie komercyjnych wersji do zastosowań niszowych. Wielu producentów i sprzedawców Uniksów wprowadza do swej oferty usługi i własne odmiany Linuksa lub włącza się w rozwijanie opartych na nich technologii (BSDI, HP, IBM, SCO, Sun, Yahoo).
Podział
Dawne Uniksy:
• System V
• BSD
Ważniejsze współczesne Uniksy:
Legenda: (B) - pochodne BSD, (V) - pochodne Systemu V, (x) - klony Uniksa, napisane od podstaw
• AIX - system stworzony w firmie IBM (VB)
• ASV - Atari System V, derywat Systemu V opracowany przez Atari dla komputera Atari TT
• A/UX - pierwszy Unix firmy Apple Computer
• BSD/OS - wcześniej znany jako BSD/386, opracowany w firmie BSDI, bliski krewny FreeBSD, NetBSD i OpenBSD (B)
• Darwin - uniksowa podstawa systemu Mac OS X, oparta na mikrojądrze Mach pochodna NeXTStep, Rhapsody oraz FreeBSD (B)
• FreeBSD - powstaje w ramach wolnego projektu (B)
• GNU/Hurd - oparty na jądrze Mach, tworzony w ramach projektu GNU fundacji FSF (x)
• GNU/Linux - Linux jest uniksopodobnym jądrem napisanym przez Linusa Torvalds, opakowanym w narzędzia GNU (x)
• HPUX - odmiana Uniksa powstała w firmie Hewlett-Packard (V)
• IRIX - multimedialny 64-bitowy Unix stworzony dla komputerów Silicon Graphics (V)
• Minix - klon Uniksa napisany od podstaw dla komputerów PC przez Andiego Tannenbauma, nierozwijany (x)
• MiNT - klon Uniksa (hybryda Uniksa i TOS-u) napisany od podstaw dla komputerów Atari ST przez Erica R. Smitha, rozwijany do tej pory (x)
• NetBSD - wysoce przenośny system tworzony w ramach otwartego projektu, jak FreeBSD (B)
• NeXTStep - opracowany w firmie NeXT na bazie jądra Mach, obecnie w Apple (B)
• OpenBSD - wywodzi się z NetBSD, także otwarty projekt (B)
• Plan9 - koncepcyjny derywatyw Uniksa powstały w pracowniach Bell Labs (V)
• QNX - klon Uniksa powstały z myślą o systemach wbudowanych (x)
• Sinix - wersja Uniksa opracowana przez niemiecką firmę Siemens-Nixdorf na bazie Xeniksa (V)
• Solaris - Unix powstały w Sun Microsystems, zastąpił SunOS (V)
• SunOS - nierozwijany już Unix Sun Microsystems dla systemów z procesorami SPARC (B)
• Tru64 - rozwojowa wersja Digital UNIX z DEC dla 64-bitowych procesorów Alpha (B)
• Ultrix - odmiana Uniksa stworzona w firmie DEC, zastąpił go Digital UNIX (B)
• UNICOS - system stworzony dla superkomputerów Cray
• UnixWare - bezpośredni derywat Systemu V powstały w Novellu, obecnie kod należy do SCO (V)
• Xenix - pierwszy Unix na PC i386, opracowany dla MS przez SCO (V)
Wywołania systemowe Uniksa
Na systemach uniksowych program jest zamknięty na tyle szczelnie, że żeby cokolwiek zrobić musi się odwoływać do odpowiednich funkcji jądra.
Z punktu widzenia programu odwołania te są ukryte w bibliotece libc - program nie wie czy dana funkcja dostarczana jest bezpośrednio przez jądro, czy też implementuje ją libc korzystając z innych mechanizmów jądra (np. na Linuksie fork zaimplementowany jest za pomocą clone).
Na x86 i innych systemach o podobnej architekturze libc (lub też czasem program bezpośrednio) komunikuje się z kernelem za pośrednictwem przerwań systemowych. W Linuksie funkcje systemowe są dostępne przez przerwanie 0x80, argumenty są przekazywane w rejestrach, w następującej kolejności: eax, ebx, ecx, edx, edi, esi, ebp. Numer funkcji systemowej jest przekazywany w eax, natomiast pozostałe argumenty zależą od rodzaju funkcji, i oczywiście nie wszystkie muszą być wykorzystane. Status operacji zwracany jest w rejestrze eax. Gdy operacja wykona się bezbłędnie jego wartość jest równa 0, w przeciwnym razie jest to (ujemna) stała z pliku asm/errno.h. Pozostałe rejestry nie są zmieniane.
W przypadku innych procesorów wywołania systemowe są wykonywane przez specjalizowane instrukcje procesora - np. Pentium 4 posiada instrukcję syscall (ang. system call).
Wywołania systemowe można śledzić za pomocą programu strace.
Oto przykład działania strace dla trywialnego programu true:
execve("/bin/true", ["true"], [/* 35 vars */]) = 0
uname({sys="Linux", node="myhost", ...}) = 0
brk(0) = 0x804a308
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/taw/local/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/taw/local/lib", {st_mode=S_IFDIR|0755, st_size=72, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=85050, ...}) = 0
old_mmap(NULL, 85050, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40012000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\\177ELF\\1\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0\\3\\0\\1\\0\\0\\0@Z\\1\\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0755, st_size=1109900, ...}) = 0
old_mmap(NULL, 1122692, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40027000
mprotect(0x40130000, 37252, PROT_NONE) = 0
old_mmap(0x40130000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x109000) = 0x40130000
old_mmap(0x40135000, 16772, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED
|MAP_ANONYMOUS, -1, 0) = 0x40135000
close(3) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4013a000
munmap(0x40012000, 85050) = 0
brk(0) = 0x804a308
brk(0x804b308) = 0x804b308
brk(0x804c000) = 0x804c000
_exit(0)
Polecenia systemu operacyjnego Unix
Zestaw najważniejszych poleceń systemu operacyjnego Unix:
• cat - wypisywanie i łączenie plików (patrz niżej)
cat
cat jest poleceniem służącym do łączenia plików, jednak zwykle jest wykorzystywany do wyprowadzania zawartości pliku na standardowe wyjście. Podane jako parametry lub wysłane na standardowe wejście pliki wysyłane są na standardowe wyjście.
Przykłady użycia
• $ cat plik.txt - wysyła zawartość 'plik.txt' na standardowe wyjście, domyślnie ekran
• $ cat plik1.txt plik2.txt > plik3.txt - zawartość plików 'plik1.txt' 'plik2.txt' jest przekierowana do 'plik3.txt'.
• $ cat plik1.txt > plik2.txt - zawartość 'plik1.txt' jest zapisywana do 'plik2.txt'. Jest to odpowiednik polecenia cp
• $ cat plik.txt | grep szukany-ciąg-znaków - zawartość 'plik.txt' jest przesyłana poprzez potok do polecenia grep, które wyświetla wszystkie wiersze zawierające 'szukany-ciąg-znaków'
• $ ls | cat -n > plik.txt - wynik polecenia ls z ponumerowanymi liniami (opcja -n) zostaje zapisany do 'plik.txt'
• chmod - zmiana praw dostępu do pliku
• chown - zmiana właściciela/grupy pliku
• cd - zmiana bieżącego katalogu
• cp - kopiowanie plików
• df - wypisywanie wolnej przestrzeni (patrz niżej)
df
df pozawala na sprawdzenie wolnej przestrzeni na poszczególnych systemach plików. Podaje ilość całkowitego, zużytego i wolnego miejsca na wszystkich lub wybranych systemach plików w wybranej przez użytkownika jednostce pojemności. Domyślnie rozmiar podawany jest w 512 kilobajtowych blokach.
Przykłady użycia
• $ df -k - wypisanie wszystkch zamontowanych partycji wraz z rozmiarami, rozmiary podane w blokach 1024k.
• $ df -h -si | grep home - wydrukowanie przez polecenie df informacji o systemach plików w formacie czytelnym dla człowieka, w jednostkach SI (1000 zamiast 1024) oraz odfiltrowanie za pomocą polecenia grep tylko linijki zawierającej informację o partycji /home
• $ df /var - wypisanie informacji o zajętości systemu plików na którym znajduje się katalog /var
• $ df -i - wypisanie informacji o zajętości i-węzłów
• du - wyświetla ilość miejsca zajmowanego przez pliki/katalogi
• echo - druk na standardowe wyjście
• find - przeszukiwanie systemu plików
• fg - przeniesienie procesu uruchomionego w tle na pierwszy plan
• grep - wypisywanie linijek zawierającyh słowa kluczowe (patrz niżej)
grep
grep jest poleceniem służącym do wyszukiwania linii pasujących do pewnego wzorca. Linie odczytuje ze standardowego wejścia i po sprawdzeniu ze wzorcem wyprowadza je na standardowe wyjście. Poza poniżej przedstawionymi grep posiada wiele innych bardziej zaawansowanych opcji
Przykłady użycia
• $ cat plik.txt | grep test - polecenie 'cat' wypisuje poszczególne linijki pliku, a grep wypisuje te, które zawierają w sobie "test"
• $ grep -B 3 -A 2 [Tt]est plik.txt - wypisuje linie zawierające "Test" lub "test", oraz 3 linijki poprzedzające oraz 2 następne.
• $ ps aux | grep -c root - listuje procesy (ps) oraz zlicza ilość linii zawierających ciąg tekstowy root.
• halt - zatrzymywanie systemu
• kill - przekazanie sygnału do procesu (domyślnie usunięcie wskazanego procesu)
• ln - tworzenie dowiązań twardych i symbolicznych (patrz niżej)
ln
Polecenie ln służy do tworzenia dowiązań twardych oraz symbolicznych.
• ls - listowanie zawartości katalogu
• mail - zarządzanie pocztą
• man - podręcznik elektroniczny
• mkdir - tworzenie katalogów
• more - rozwinięcie o sterowanie strumieniem
• mount - montowanie urządzeń/zasobów w systemie plików (patrz niżej)
mount
Polecenie mount pozwala na zamontowanie partycji, urządzeń itp. w podanym katalogu (punkcie montowania)
Przykłady użycia
• mount /dev/hdb1 /mnt/hdb1 - Montuje pierwszą partycję dysku primary slave(hdb1), do odpowiadającego mu katalogu.
• mount -t smbfs //abc/zasoby /mnt/zasoby - Montuje 'zasoby' udostepnione na komputerze o nazwie 'abc' do katalogu /mnt/zasoby. Od tego momentu zasoby są widoczne tak jakby były zasobami lokalnymi
• mv - przenoszenie/zmiana nazwy pliku
• passwd - zmiana hasła
• ps - pobieranie informacji o aktywnych procesach
• pwd - wydruk aktualnego katalogu
• rm - usuwanie plików
• rmdir - usuwanie katalogów
• startx - uruchomienie środowiska X Window System
• su - logowanie na konto innego użytkownika (patrz niżej)
su
Polecenie pozwalające zalogować się tymczasowo na inne konto. Domyślnie loguje się na konto Super Usera (użytkownika root), stąd też nazwa su. Oczywiście aby zalogować się na inne konto należy znać także hasło, chyba że logujemy się z konta super usera.
Przykłady użycia
• $ su -c mc - uruchamia program midnight commander z prawami roota
• $ su -c "rm -R ./katalog*" - usuwa wszystki pliki i katalogi zaczynające się od słowa "katalog", korzystając z przywilejów roota
• $ su inny_user - loguje aktualnego użytkownika jako inny_user
• umount - odmontowanie zasobu z systemu plików (patrz mount)
• tail - wypisanie ostatnich 10 linijek tekstu, także używane w
diagnostyce. (patrz niżej)
tail
Pokazuje ostatnie 10 linijek pliku. Posiada kilka opcji które robią z tego programu narzędzie diagnostyczne.
Przykłady użycia
• $ tail -c 100 /var/log/syslog - Wypisuje ostatnie 100 znaków z pliku syslog z katalogu /var/log
• $ tail -f --pid=1274 /var/log/messages - Typowe polecenie diagnostyczne polegające na obserwowaniu zmian w plik messages (-f), z katalogu /var/log, dopóki, doputy program o pidzie 1274 nie zakończy swego działania(--pid=1274).
• $ tail -f -c 0 /var/log/syslog - Inne polecenie, tym razem program wypisuje tylko nowe wpisy do pliku syslog, z katalogu /var/log. Program będzie to wykonywał do zakończenia przez użytkownika.
• whoami - pokazuje bieżący efektywny uid, czyli identyfikator użytkownika, z którego prawami działamy
Inne przykłady łączenia kilku poleceń
• su -c "mount -t smbfs //inny_komputer/share /mnt/net_share; cp -r /mnt/net_share /home/uzytkownik/dane; chown uzytkownik:users -r /home/uzytkownik/dane; umount /mnt/net_share" - Podane polecenie skopuje zawartość udostepnionych zasobów z inny_komputer, nada im odpowiednie prawa dostępu i potem odmontuje zasoby sieciowe. Wszytko jest wykonywane z poziomu roota, gdyż domyślnie tylko on może montować partycje i zasoby innych komputerów.
Porównanie powłok w systemie UNIX
Powłoka to program , który jest łącznikiem między użytkownikiem a jądrem , które z kolei jest programem zarządzającym wszystkimi zasobami komputera. Jądro jest sercem systemu operacyjnego UNIX , podczas gdy powłoka czy polecenie takie jak cat, to tylko jego rozszerzenia .Jądro jest uruchamiane tuż po włączeniu komputera. Jednym z zadań jądra jest uruchamianie procesów powłoki dla rozpoczynających pracę użytkowników. Każdy otrzymuje własną kopię powłoki .
Powłoka wyświetla na ekranie znak zachęty(zwykle znak $ lub %)- gotowość przyjęcia polecenia . Pojawienie się tego znaku rozpoczyna cykl, w jakim pracuje powłoka. Na jeden cykl składa się :
- 1) wypisanie znaku zachęty ($ lub %),
- 2) czekanie na wprowadzenie tekstu polecenia przez użytkownika,
- 3) analiza wiersza polecenia, wyszukiwanie odpowiedniego programu
realizującego to
polecenie ,
- 4) powłoka zleca jądru wykonanie odszukanego programu,
- 5) powłoka przyjmuje od jądra odpowiedź, rozpoczyna nowy cykl od pktu 1 )
Przerwanie powtarzania cykli może nastąpić jeśli polecenie użytkownika brzmi: Ctrl-D , co oznacza, że użytkownik nie ma zamiaru kontynuować dalszych poleceń; powłoka zleca wtedy jądru zamknięcie sesji użytkownika.
Poza funkcjami interpretatora poleceń, powłoka ma także elementy języka programowania, które obejmują polecenia realizujące pętle ( for - in - do - done i while - do - done),do warunkowego wykonania (if - then - else - fi) , wyboru (case),zmieniające bieżący katalog procesu (cd ) i kilka innych.
Interpretator poszukując polecenia przegląda katalogi w określonej kolejnoŹści, którą użytkownik może zmienić w każdym jego wywołaniu. Zwykle wykoŹnuje polecenie synchronicznie, czekając na zakończenie wykonania poprzedniego wiersza poleceń przed rozpoczęciem czytania następnego. Jest jednak również możliwe wykonanie asynchroniczne, kiedy interpretator czyta następny wiersz poŹleceń i wykonuje je nie czekając na zakończenie poprzedniego. O poleceniach wykonywanych asynchronicznie mówi się, że są wykonywane w tle, np. wpisanie polecenia who powoduje wykonanie przez system programu, zapisanego w pliku /bin/who4, który drukuje listę osób pracujących w danej chwili w systemie. Podczas wykoŹnania who interpretator czeka na jego zakończenie, a następnie wyświetla znak zachęty i czeka na wprowadzenie przez użytkownika kolejnego polecenia. Polecenie
who &
powoduje wykonanie programu who w tle i interpretator jest natychmiast gotowy do przyjęcia następnego polecenia.
Każdy proces wykonujący się w systemie UNIX ma określone środowisko przetwarzania, w skład którego wchodzi bieżący katalog. Bieżący katalog procesu jest dostawiany na początek wszystkich nazw ścieżkowych, które nie zaczynają się od znaku prawego ukośnika. Użytkownik może wykonać polecenie interpretatora cd(zmień katalog)żeby przesunąć się w drzewie systemu plików i zmienić bieżący katalog .
Polecenie
cd / user / src / uts
zmienia bieżący katalog interpretatora na katalog / usr / src / uts.
Ponieważ interpretator jest programem użytkowym, a nie częścią jądra, więc można go łatwo modyfikować i dostosowywać do określonego środowiska.
Filozofią UNIX-a jest dostarczenie podstawowych udogodnień, które umożliwiają użytkownikom pisanie małych modularnych programów, używanych jako bloki budulcowe do konstruowania bardziej złożonych. Takim podstawowym udogodnieniem widocznym dla użytkownika interpretatora jest mechanizm zmiany przypisania wejścia - wyjścia. Procesy zwyczajowo mają dostęp do trzech plików: czytają ze standardowego pliku wejściowego, piszą na standardowy plik wyjściowy i wysyłają komunikaty o błędach na standardowy plik diagnostyczny.
W systemie UNIX istnieje wiele różnych powłok (np. sh, ksh, zsh, csh itd.). Administrator przydziela każdemu użytkownikowi jego powłokę standardowa (uruchamiana w chwili logowania się do systemu); użytkownik może tez uruchomić dowolna powłokę zainstalowaną w systemie.
Trzy najczęściej spotykane powłoki mają podobne możliwości i nazywają się Bourne (sh) , C (csh) i Korn (ksh).Powłoki Bourne i C różnią się nieznacznie składnią niektórych standardowych poleceń , przy czym powłoka C ma dodatkowe możliwości , np. mechanizm historii wydanych poleceń . Powłoka Korn ma taką samą składnię jak Bourne oraz większość możliwości powłoki C .
Każda powłoka ma niewiele wbudowanych poleceń (takich jak cd) - wszystkie inne są pobierane z plików. W systemie Unix nie ma standardowych rozszerzeń nazwy plików , które oznaczałyby wykonywalne. Jeżeli w nazwie występuje ścieżka , powłoka szuka programu tylko w podanym katalogu, w przeciwnym wypadku są przeszukiwane wszystkie katalogi występujące w zmiennej środowiska PATH
Większość użytkowników Unix-sa kontaktuje się z systemem za pośrednictwem shella , odpowiedzialnego za interpretację poleceń . O tym, który shell zostanie załadowany po otwarciu na terminalu sesji pracy, decyduje administrator przy rejestrowaniu użytk
ownika w systemie , użytkownik może zmienić shella w czasie pracy.
Dostępne shelle
System Unix umożliwia użytkownikowi dostęp do różnych shelli. Większość wersji Unixa udostępnia ich trzy podstawowe odmiany :
sh , rsh -Shell Bourne'a ( sh - standardowy i rsh- okrojony ; ang. restricted shell),
napisany przez Stephana R. Bourne'a z Bell Labs. Shell rsh jest identyczny jak
sh , ale ogranicza pewne prawa użytkownika ; w niektórych realizacjach Unixa
nazwa rsh identyfikuje shella zdalnego (ang. remote shell) ;
csh -C-shell, w zakresie składni rozszerza możliwości shella Bourne'a o pewne cechy
języka C , skąd bierze się jego nazwa . Napisany został przez Billa Joy'a (z
Uniwersytetu Kalifornijskiego w Berkeley ) i jest obecnie adoptowany dla
wszystkich odmian Unixa;
ksh , rksh -Shell Korn'a (ksh - standardowy i rksh - okrojony) - rozszerzona wersja sh ,
napisana w 1983 r. przez Davida Korna (z Laboratoriów Bella) i udostępniona
w 1986 r. Obecnie jest dostępny w większości odmian Unixa.
Wszystkie shelle wywodzą się z jago dwu podstawowych odmian : sh ( rsh , ksh , rksh , bash , bdsh , zsh ) i csh ( tcsh ) .
W porównaniu z shellem sh , shelle csh i ksh udostępniają dodatkowe możliwości , takie jak : zapamiętywanie poleceń i ich przywoływanie , edycję oraz sterowanie procesami . Shell ksh udostępnia ponadto szereg dodatkowych zmiennych środowiskowych , np. pamiętających nazwę bieżącego katalogu , bieżący czas itp.
W poszczególnych odmianach Unixa dostępne są również inne shelle np. :
bash - ponowiony shell Bourne'a (ang. Bourne Again Shell) , opracowany przez
fundację FSF , udostępniony w 1989 r. ; zbliżony do ksh ;
scosh - dostępny w SCO UNIX R.3.2v.4.x , który obok możliwości standardowego
shella , udostępnia wiele dodatkowych funkcji, wykonywanych z wykorzystaniem mechanizmów okien i menu (w trybie tekstowym );
keysh - dostępny w HP-UX , który obok funkcjonalności zbliżonej do shella ksh
udostępnia użytkownikowi w trybie interakcyjnym wyodrębniony zestaw poleceń
związanych z klawiszami funkcyjnymi , wspomagany przez menu wyświetlane w
dolnej linii ekranu oraz przez klawisz podpowiedzi . Jest wygodny nie tylko dla
początkujących użytkowników systemu .
Shelle sh , csh i ksh są używane zarówno do pracy interakcyjnej , jak i do interpretacji większej liczby poleceń umieszczonych w plikach wsadowych (ang. batch files ), nazywanych również skryptami shellowymi( ang. shell scripts) lub krótko - skryptami . Wskazują one duże wzajemne podobieństwa , przy czym shell sh oferuje w zasadzie podzbiór możliwości pozostałych . Shelle sh i csh towarzyszą Unixowi od momentu jego powstania , natomiast ksh powstał w okresie późniejszym i zdobywa sobie coraz większą popularność.
Domyślnym shellem (proponowanym przez system w chwili rejestrowania użytkownika) jest shell sh .
Systemowe środowisko pracy
Systemowe środowisko pracy użytkownika jest ustalane na podstawie danych pobieranych z plików ewidencyjnych ( /etc/passwd i /etc/group ) oraz na podstawie wykonania pewnych czynności inicjacyjnych , opisanych we właściwych dla danego shella plikach startowych , umieszczonych w katalogu macierzystym danego użytkownika . Tymi plikami są :
-profile -dla shelli : sh, rsh, ksh, rksh ;
-login i .cshrc -dla shella csh.
Jest to środowisko startowe , które może być modyfikowane przez użytkownika po otwarciu na terminalu sesji pracy.
Systemowe środowisko pracy użytkownika jest (za wyjątkiem zmiennych lokalnych ) dziedziczone przez procesy; które są aktywowane przez tego użytkownika. Jest ono standardowym środowiskiem tych procesów . Dla każdego użytkownika środowisko systemowe może być inne . W systemie Unix istnieją dwa rodzaje użytkowników :
• zwykli użytkownicy ;
• użytkownik uprzywilejowany (administrator systemu o nazwie root).
Każdy nowy użytkownik musi być zarejestrowany w systemie przez administratora. Informacje o zarejestrowanych użytkownikach są umieszczane w dwóch pikach ewidencyjnych :
/etc/passwd -pliku haseł i innych danych inicjacyjnych ;
/etc/group -pliku opisu grup użytkowników .
Nazwa i hasło użytkownika są podawane przez użytkownika w chwili otwierania przez niego na terminalu sesji swojej pracy . Nazwa jest zawsze wymagana , natomiast hasło jest wymagane tylko wtedy , jeśli zostało określone w chwili rejestrowania użytkownika (otwieranie jego konta).
Numeryczny identyfikator użytkownika(UID) służy do identyfikacji użytkownika w systemie , w tym do identyfikacji jego plików i uruchomionych przez niego procesów.
Numeryczny identyfikator grupy (GID) identyfikuje grupę użytkowników .
Nazwa programu startowego(ang. Login-Shell) , wpisywany do pliku /etc/passwd , może być nazwą zarówno jednego z dostępnych w systemie shelli(domyślnie /bin/sh ) , jak i nazwą dowolnego programu użytkowego.
Systemowe środowisko pracy procesów użytkownika(ang. environment) dla wszystkich shelli tworzone jest w podobny sposób. Definiują go przede wszystkim : informacje wpisane w pliku ewidencyjnym /etc/passwd , deskryptory otwartych plików oraz wartości zmiennych predefiniowanych w shellu lub ustalanych przez użytkownika .Liczba i nazwa zmiennych predefiniowanych w poszczególnych shellach mogą być różne .
Do zmiennych, które występują w większości z nich i mają to samo znaczenie , należą m.in. :
HOME -pełna ścieżkowa nazwa katalogu macierzystego;
LOGNAME -nazwa użytkownika;
PATH -lista nazw katalogów , w których będą poszukiwane wywoływane przez
użytkownika polecenia i programy ;
SHELL -nazwa shella startowego(/bin/sh, /bin/ksh , /bin/csh , ...);
TERM -nazwa trybu pracy terminala;
TZ -symbol strefy czasowej ;
PS1 -tekst ,,symbolu gotowości" do przyjmowania poleceń :
sh, ksh csh Rodzaj użytkownika
# # Użytkownik uprzywilejowany
$ % Użytkownik zwykły
Inicjowanie systemowego środowiska pracy użytkownika jest realizowane w drodze odczytu i analizy informacji zawartych w plikach ewidencyjnych , w pliku /etc/profile oraz w drodze wykonania pewnych czynności opisanych w plikach startowych danego użytkownika (umieszczanych w jego katalogu macierzystym):
-profile -dla shelli sh , ksh ;
-login i .cshrc -dla shella csh.
Shelle sh, ksh i csh pozwalają wiązać standardowe wejścia/wyjścia z plikami (za pomocą symboli: <, << , > , >> , >& , <&, <&-, >&-)
Shell Bourne'a
Shell Bourne'a, reprezentowany w systemie Unix przez program sh, udostępnia język opisu poleceń, przeznaczony do współpracy z systemem. Jego zaletą jest to, że występuje we wszystkich odmianach Unixa i systemów unixo-podobnych.
Polecenia obsługiwane przez shella można podzielić na następujące kategorie:
• polecenia wewnętrzne (wbudowane w shella);
• polecenia zewnętrzne (pamiętanie w plikach);
• programy binarne;
• skrypty shellowe.
Opisywany shell może czytać polecenia z terminala albo z pliku, co pozwala zapamiętywać zestawy poleceń w celu późniejszego - zwykle wielokrotnego - ich wykorzystania. Plik, w którym zapisano pewien zestaw poleceń do wykonania, jest nazywany skryptem shellowym (ang. shell script).
Język shella może być wykorzystywany zarówno do obsługi pojedynczych poleceń, jak i do opisu złożonych zależności pomiędzy wykonywanymi poleceniami. Istnieją w nim takie pojęcia jak: zmienna, instrukcje podstawiania i wczytywania wartości zmiennych. Ponadto do sterowania wykonaniem poleceń mogą być wykorzystane konstrukcje, takie jak: if, then, else, case, for, while, until. Skrypty shellowe mogą zawierać definicje własnych funkcji, jak również mogą wywoływać inne skrypty, przy czym mogą być one wykonywane bezpośrednio lub jako odrębne procesy.
Polecenia są znajdowane w wyniku przeglądania katalogów w systemie plików w takiej kolejności, która została określona w środowisku shella przez wartość zmiennej PATH, to znaczy najpierw przeszukiwany jest katalog wymieniony w pierwszej kolejności (najczęściej jest to katalog bieżący - .), potem drugi itd.
Przy pisaniu skryptów wyłącznie dla powłoki Bourne w pierwszym wierszu powinien być komentarz w postaci
# ! /bin/sh
Jeżeli ten skrypt zostanie wywołany w innej powłoce , uruchomi ona nowy proces sh do wykonania go. Jest to konieczne ,ponieważ instrukcje sterujące mają odmienną postać w różnych powłokach.
Zgłoszenia gotowości przyjmowania poleceń
Po otwarciu przez użytkownika sesji swojej pracy (l o g i n :), shell jest gotów do przyjmowania poleceń . Stan tej gotowości sygnalizuje on tzw. symbolem gotowości do przyjmowania poleceń (inaczej symbolem zachęty / zgłoszenia - ang. prompt).Standardowo ma ono jedną z następujących postaci :
$ - jeżeli użytkownik jest zwykłym użytkownikiem ;
# - jeżeli jest on użytkownikiem uprzywilejowanym.
Shell sh ma ograniczone możliwości modyfikowania symbolu gotowości . Ograniczają się one do głównie do jego statycznej zmiany przez przypisanie zmiennej PS1 nowej wartości tekstowej ( w innych shellach możliwe jest definiowanie dynamicznych symboli gotowości , pokazujących np. bieżący katalog i bieżący czas) .
Przeadresowywanie standardowego strumienia błędów
W powłokach Bourne i Korn standardowy strumień błędów przeadresowuje się pisząc 2>nazwa_pliku; zatem polecenie
cat xxxx 2> blendy
wypisze wszelkie komunikaty o błędach do pliku bledy.
Cytowanie znaków specjalnych
Istnieje grupa znaków, nazywanych metaznakami , które mają dla shella specjalne znaczenie :
? [ ] - ! , ; , & , | ^ , < > , * ? $ @ # ! , $ , # , \ , spacja i tabulator, newline , ( ) { } , [ ] - ! = , && || .
Zmienne języka shell
W języku shella sh dostępne są zmienne typu tekstowego(w csh również typu numerycznego), przy czym (we wszystkich shellach) przy pomocy polecenia expr liczby zapisane tekstowo mogą być traktowane jako wartości numeryczne (całkowite).
Parametry specjalne i zmienne shella
Zmienne predefiniowane, takie jak HOME, PATH, IFS, PS1, swoje pierwotne wartości otrzymują w chwili otwierania na terminalu sesji pracy użytkownika (w wyniku wykonania pliku startowego $HOME/.profile) i mogą być modyfikowane zarówno w trybie interakcyjnym, jak i w wywoływanych skryptach shellowych.
Niektóre zmienne używane przez shella sh
Listę predefiniowanych zmiennych można zobaczyć, wprowadzając tuż po otwarciu sesji pracy polecenie env lub printenv.
$HOME
Domyślny argument dla polecenia cd wywołanego bez argumentu. Polecenie cd bez
argumentu jest równoważne poleceniu:
cd $HOME
Pierwotna wartość tej zmiennej (domyślny katalog użytkowania) jest ustalana (czytana z pliku /etc/passwd) w chwili otwierania przez użytkownika sesji pracy i może być zmieniona w chwili wykonania pliku startowego .profile lub poleceniem podstawienia z poziomu shella.
$PS1
Domyślny symbol gotowości shela (ang. Prompt String_1):
$ - dla zwykłego użytkownika;
# - dla użytkownika uprzywilejowanego.
$SHELL
Nazwa startowego shella, przydzielonego użytkownikowi po otwarciu sesji pracy.
Zakres ważności zmiennych
Zmienne predefiniowane (zainicjowane w chwili otwierania sesji pracy) są traktowane jako zmienne globalne. Ich zakres rozciąga się na proces shella, wszystkie procesy aktywowane przez użytkownika i ich procesy potomne.
O tym, które zmienne mają być przesyłane, informuje shella polecenie export, mające postać:
export nazwa_zmiennej ...
Warto pamiętać, że sposób ustawiania zmiennych lokalnych (prywatnych) i globalnych (środowiskowych) jest zależny od używanego shella.
Sposoby definiowania zmiennych
Zmienne Zmienne lokalne Zmienne środowiskowe
csh, ksh set nazwa=wartość setenv nazwa wartości
sh, ksh, bash nazwa=wartość nazwa=wartość export nazwa
Wywoływanie shella i skryptów shellowych
Ogólna postać polecenia wywołującego shella sh jest następująca:
sh [ -opcje ] [ argumenty ].
Powłoka Korn
Powłoka Korn ma identyczną jak powłoka Bourne składnię poleceń i instrukcji, zawiera jednak pewne użyteczne rozszerzenia. Obejmują one mechanizm historii znany z programu DOSKEY oraz mechanizm kontroli zadań. Powłoka Korn nie jest tak rozpowszechniona jak powłoki Bourne lub C.
Historię wprowadzanych poleceń można zapamiętać, ustalając wartość HISTSIZE. Historia wykonanych poleceń zostanie zapamiętana między kolejnymi sesjami w pliku o nazwie określonej przez zmienną HISTFILE. Wcześniejsze polecenia można przywołać do wiersza poleceń i poddać redakcji za pomocą klawiszy znanych z edytora vi.
Swój katalog osobisty można podawać w nazwach plików po prostu jako ~. Dla dowolnych poleceń (wraz z parametrami) można zdefiniować synonimy, które można rozumieć jak szybkie skrypty powłoki. Do obliczania wartości wyrażeń służy wbudowana instrukcja let zamiast polecenia expr. Twórcy skryptów mają do dyspozycji wiele nowych instrukcji, w tym instrukcję wyboru select.
Sterowanie zadaniami umożliwia uruchamianie i wstrzymanie procesów oraz przenoszenie procesów z tła na pierwszy plan i odwrotnie.
Shelle okrojone rsh i rksh
Dla standardowych shelli sh i ksh w odmianach Unixa istnieją ich wersje okrojone(ang.restricted shells) o nazwie rsh i rksh. Mają one takie same możliwości jak pełne wersje, za wyjątkiem tego, że ustalają dla użytkownika następujące ograniczenia :
• plik startowy użytkownika ($HOME/.profile) nie może być• przez niego modyfikowany;
• użytkownik nie może modyfikować• (zmieniać• ) wartości zmiennej PATH ;
• użytkownik ma dostęp tylko do programów (i poleceń) umieszczonych w swoim katalogu macierzystym oraz do umieszczonych w katalogach wskazanych w wartości zmiennej PATH .
Typową praktyką administratorów systemu jest tworzenie katalogu /usr/rbin i
umieszczanie w nim tylko pewnej liczby poleceń , niezbędnych użytkownikom
pracującym pod kontrolą shella okrojonego. Nie muszą to być fizyczne kopie plików,
lecz dowiązane do nich nazwy.
• roboczym katalogiem aktualnym użytkownika może być tylko jego katalog
macierzysty.
• niedozwolone jest tworzenie lub zapisywanie plików w wyniku przeniesienia
standardowego wyjścia za pomocą symboli: >,>>.
Ograniczenia te oraz możliwość odpowiedniego ustawienia praw dostępu dają administratorowi systemu możliwość określania kolejnych ograniczeń. Okrojone shelle są często przypisywane początkującym użytkownikom ( w celu ochrony systemu przed skutkami braku ich doświadczenia ) oraz tym użytkownikom , którzy nie powinni mieć prawa korzystania z pewnych zasobów systemu .
Nazwa shelli okrojonych (rsh i rksh) są w rzeczywistości nazwami dowiązanymi do ich wersji pełnych (odpowiednio plików /bin/sh i /bin/ksh), a o tym , czy shell pracuje w wersji pełnej czy z restrykcjami, decyduje nazwa podana w jego wywołaniu .
Powłoka C
Powłoka C jest popularna mimo, iż nie jest dostępna we wszystkich systemach Unix. Zawiera mechanizm historii, sterowanie zadaniami i składnię skryptów zbliżoną do składni języka C.
Standardowym znakiem zachęty powłoki C jest %. Gdy chs jest określony w pliku /etc/passwd jako powłoka uruchamiana po zarejestrowaniu się w systemie. Można go zmienić odpowiednio ustalając wartość zmiennej prompt.
Można zmienić wiele parametrów powłoki, by dostosować ją do swoich oczekiwań. Najpopularniejszym sposobem jest set ignoreeof, który spowoduje, że powłoka będzie ignorować znak . Zamiast niego trzeba wpisać logout. Umożliwia to zabezpieczenie się przed przypadkowym wyrejestrowaniem się z systemu przez naciśnięcie o jeden raz za dużo.
Plik . login jest wykonywany przez powłokę bezpośrednio, kiedy użytkownik zarejestruje się w systemie. Przy wyrejestrowaniu się powłoka wykonuje plik . logout. Każde nowo uruchamiane wcielenie powłoki, łącznie z tym pierwszym, wykonuje plik . cshrc. Można w nim nadać wartości tym zmiennym, które muszą mieć określoną wartość za każdym razem, nawet w podpowłoce utworzonej przez operator ( ) .
Skrypt zostanie wykonany w powłoce wywołującej po wywołaniu za pomocą instrukcji source :
source nazwa_skryptu
Przy pisaniu skryptów dla powłoki C tak jak w powłoce Bourne w pierwszym wierszu powinien być wpisywany komentarz postaci
# ! /bin/ csh
Kiedy taki skrypt zostanie wywołany w innej powłoce, uruchomi ona csh do jego interpretacji. Jest to niezbędne, ponieważ składnia instrukcji sterujących powłoki C jest odmienna od instrukcji innych powłok.
Mechanizm historii umożliwia zachowanie wydawanych poleceń do późniejszego przywołania .W celu włączenia tego mechanizmu nadać trzeba jakąś wartość zmiennej history (będzie to liczba zapamiętywanych poleceń):
set history=wartość.
Porównanie shelli
Dostępne shelle wykazują duże podobieństwa. Różnią się głównie zakresem oferowanych możliwości i udogodnień..
Powłoka sh jest:
• najprostszym shellem ;
• występuje we wszystkich odmianach systemu Unix;
• pod względem składni swoich poleceń wewnętrznych jest prawie w 100%, a pod względem ogólnych możliwości w około 90% - podzbiorem wszystkich pozostałych shelli, z których rozszerzeniami w razie potrzeby będzie łatwo użytkownikowi się zapoznać;
• istotne różnice występują tylko w stosunku do shella csh, w którym symbolem gotowości dla roota jest % (zamiast #) oraz definiowanie zmiennych środowiskowych poleceniem setenv (a nie export).
Ogólne cechy wybranych shelli:
Shell csh w porównaniu z sh
• Mechanizm historii poleceń umożliwia wyświetlanie poleceń wcześniej wprowadzonych i powtórne wykonanie wskazanego polecenia (z ograniczoną możliwością jego edycji). Mechanizm ten bazuje na poleceniu history , które wyświetla listę kilkunastu ostatnio wprowadzonych i ponumerowanych poleceń. Powtórne wykonanie polecenia z tej listy odbywa się poprzez zapis
!nr_polecenia
• Dodatkowe polecenie alias pozwala definiować• dodatkowe polecenia, np.
alias Im 'Is -I | more'
(w sh może on być zastąpiony przez odpowiednie wykorzystanie funkcji shella,
zdefiniowanej przez użytkownika ).
• Wyrażenia mogą być obliczane przez zapis @y=wyrażenie.
• Drobna różnica występuje w zakresie definiowania zmiennych. Zmienne lokalne są ustawiane w csh poleceniem set natomiast zmienne globalne (środowiskowe) - poleceniem setenv.
Shell ksh w porównaniu z sh
• Istnieje szereg użytecznych dodatkowych zmiennych środowiskowych np.:
EDITOR,ERRNO,LINENO,PPID,PWD,SECONDS,TMOUT,VISUAL.
• Istnieje możliwość• łatwego definiowania dynamicznego symbolu gotowości , na przykład pokazującego bieżący katalog:
PS!='$PWD>'
• Istnieje możliwość• uzyskania obsługi historii poleceń i pełnej edycji wybranego polecenia edytorem emacs lub edytorem vi , po wprowadzeniu jednego z poleceń:
EDITOR=vi
VISUAL=vi
Po ustawieniu jednej z tych zmiennych , w jednowierszowym (niewidocznym)
oknie ,dostępnym w wierszu w którym wyświetlany jest symbol gotowości, można
przeglądać plik z historią wcześniej wprowadzonych poleceń
($HOME/.sh_history).O ile wskazano edytor vi (i nie znajdujemy w trybie
wstawiania znaków ) klawisze k i j powodują wyświetlanie polecenia
poprzedniego i następnego względem aktualnie wyświetlanego polecenia ,
natomiast klawisze h i I pozwalają przemieszczać kursor po tekście wyświetlanego
polecenia. Dostępne są wszystkie klawisze edycyjne wskazanego edytora . Po
korekcie polecenia i naciśnięciu klawisza Return polecenie jest oddawane do
wykonania . Jeżeli chcemy wykonać edycję aktualnie wprowadzanego polecenia
-należy wejść w tryb komend edytora vi (nacisnąć klawisz Esc).
• Istnieje możliwość automatycznego zamykania nieaktywnych sesji pracy. W tym celu poprzez wartość zmiennej środowiskowej TMOUT , umieszczonej w pliku $HOME/.profile , należy wskazać czas w sekundach , po którym nastąpi zamknięcie sesji pracy (,,wylogowanie") o ile w podanym czasie - po wyświetleniu ostatniego symbolu gotowości - nie zostało wprowadzone żadne polecenie. Przykładowo pokazane poniżej wiersze , wstawione do pliku .profile , spowodują zamknięcie sesji pracy po 15 minutach nieaktywności użytkownika (o ile nie uruchomił jakiegoś programu) :
MIN=15; SEK='expr $MIN * 60'
echo Ustawiono zamknięcie sesji po $MIN minutach nieaktywności"
TMOUT=$SEK; export TMOUT
• Istnieją dodatkowe konstrukcje sterujące i polecenia wewnętrzne , np. : alias , fc , function , jobs , let , select , print . Jest to przykład wykorzystania polecenia alias, definiującego nowe polecenia :
alias type='cat'
alias dir='Is - Ia'
alias del='rm -i'
Pliki konfiguracyjne shelli
Wszystkie pliki konfiguracyjne danego shella powinny być umieszczane w katalogu macierzystym użytkownika .
Nazwa shella Program Systemowy plik startowy Lokalny plik startowy Lokalny plik kończący sesję
Shell Bourne'a /bin/sh /etc/profile $HOME/.profile
Shell Korn'a /bin/ksh /etc/profile $HOME/.profile $ENV
keysh /usr/bin/keysh /etc/profile $HOME/.profile $ENV
csh /bin/csh /etc/csh.login /etc/.cshrc $HOME/.login $HOME/.cshrc $HOME/.logout
• Shell keysh jest dostępny tylko w systemie HP-UX.
• Nazwa bazowa okrojonych wersji shelli są poprzedzone literą r :
/bin/rsh
/bin/rksh
/usr/bin/rkeysh
• W niektórych systemach (np.HP_UX) wzorcowe pliki startowe i kończące sesje pracy dla noworejestrowanych użytkowników są zlokalizowane w katalogu /etc i mają nazwy :
/etc/d.profile
/etc/d.login
/etc/d.cshrc
/etc/d.logout
• Katalogiem $HOME dla użytkownika o nazwie root jest katalog główny.