Przedmowa
System UNIX jest obecnie najbardziej rozpowszechnionym wielodostępnym, wieloprogramowym systemem operacyjnym, uznawanym za podstawowy system dla mikrokomputerów 16-bitowych, a zwłaszcza 32-bitowych. Systemy klasy UNIX mogą być stosowane prawie we wszystkich minikomputerach, supermikrokomputerach i stacjach roboczych.
UNIX jest powszechnie wykorzystywany w jednostkach administracji państwowej, bankowości, przedsiębiorstwach przemysłowych i handlowych na całym świecie, staje się między innymi standardem w Europejskiej Wspólnocie Gospodarczej. W celu propagowania rozwiązań informatycznych opartych na systemie UNIX oraz kierowania rozwojem tego systemu w 1988 roku została powołana organizacja UNIX International, która skupia producentów sprzętu, oprogramowania aplikacyjnego i systemowego, sprzedawców i użytkowników systemu UNIX oraz agencje rządowe i placówki naukowe z całego świata. Do tej liczącej ponad 200 członków organizacji należą: AT&T, Control Data, Fujitsu, ICL, Motorola, NCR, NEC, Olivetti, SCO, Sun Microsystems, Toshiba, UNISYS, WANG. UNIX International odpowiada przede wsrystkim za kierowanie rozwojem otwartego systemu operacyjnego UNIX System V. Jej członkowie biorą czynny udział w planowaniu rozwoju systemu UNIX. Zapewnia to dostosowanie rozszerzeń systemu do wymagań rynku oraz do norm opracowywanych przez organizacje przemysłowe. Działania UNIX International zmierzają również do zachowania w prryszłości zgodności z już istniejącymi na świecie ponad 16 milionami instalacji systemu UNIX, gwarantując w ten sposób ochronę inwestycji użytkowników w oprogramowanie oraz szkolenie personelu.
Omawiana wersja systemu operacyjnego UNIX System V jest zgodna z zaleceniami grupy UNIX International. Podręcznik wprowadza czytelnika w problematykę użytkowania systemu i jest przeznaczony dla ludzi zainteresowanych przede wszystkim tym, co system ma do zaoferowania, i jak z tej oferty skorzystać. Zakres materiału odpowiada potrzebom użytkownika interakcyjnego, ale również programisty systemowego i administratora systemu, których głównymi zadaniami są budowa programów wykonywanych w środowisku systemu UNIX oraz nadzorowanie i organizowanie pracy systemu.
Najlepszą metodą poznania systemu operacyjnego jest stosowanie go w praktyce. Aby ułatwić to początkującym użytkownikom, w pierwszej części każdego rozdziału podajemy w zwięzłej i prostej postaci podstawowe wiadomości o poszczególnych elementach systemu. Omawiane rozwiązania mają charakter uniwersalny, to znaczy są spotykane w zdecydowanej większości wersji systemu. Te fragmenty tekstu można czytać wcześniej, przygotowując się do pracy z komputerem. Pozostałe części poszczególnych rozdziałów zawierają wiadomości, z których można korzystać pracując przy terminalu,
I'r~ednmwn
wydając kolejne polecenia. Niestety, nie o wsrystkich omawianych tutaj poleceniach można powiedzieć, że ich postać jest zunifikowana - taka sama we wszystkich wersjach systemu (mimo zabiegów stowarzyszenia UNIX International). W zależności od wersji systemu polecenia mogą się nieco różnić, szczególnie oznaczeniem opcji. W tych szczególnych przypadkach autorzy musieli się zdecydować na wybór jednej, określonej wersji systemu. Wybór padł na SCO UNIX. Na szczęście takich szczególnych przypadków jest niewiele i niewiele miniemy się z prawdą twierdząc, że podręcznik ma charakter uniwersalny, niezależny od wersji systemu. Takim szczególnym przypadkiem jest problem administracji systemem - tutaj w całości ilustracją omawianych zagadnień jest SCO LTIVIX.
Książka ta, oprócz wiedry typowo użytkowej o systemie, zawiera wiedzę często określaną mianem akademickiej. Są to informacje o mechanizmach wewnętrznych systemu, takich jak: zarządzanie systemem plików, pamięcią operacyjną, urządzeniami wejścia/wyjścia i procesorem. Wiedzę o takim charakterze powinna posiąść osoba aspirująca do pracy na stanowisku administratora systemu. Nie sposób bowiem efektywnie zarządzać pracą systemu bez znajomości jego mechanizmów wewnętrznych. Przykładowo, bez znajomości mechanizmów wewnętrznych systemu oddanego pod opiekę administratora nie jest on w stanie prawidłowo ustawiać parametry jego pracy, a tym bardziej dynamicznie je modyfikować wraz ze zmianą warunków pracy systemu. Dla studentów kierunków informatycznych studia nad tymi zagadnieniami powinny wynikać z chęci poznania metod implementacji rozwiązań teoretycznych, jak na przykład organizacja pamięci ze stronicowaniem na żądanie. Tego typu wiedza o systemie UNIX jest zawarta przede wszystkim w rozdziale poświęconym jądru systemu.
W ukształtowaniu tego podręcznika miało udział wiele osób, autorzy im wszystkim serdecznie dziękują. Szczególną wdzięczność wyrażają: mgr. inż. Tomaszowi Kokowskiemu - autoryzowanemu dostawcy produktów firmy SCO UNIX - za cenne uwagi dotyczące jądra i administracji systemem, mgr. inż. Marcinowi Januchcie za opracowanie programów i fragmentów tekstu dotyczących blokowania plików i wspólnego wykorzystywania pamięci operacyjnej oraz studentom kierunku informatyka Politechniki Poznańskiej, których propozycje wzbogaciły pracę.
R zdzi ~ '~' o a
Wprowadzenie
Charakterystyka systemu UNIX
Twórcami systemu operacyjnego UNIX są Ken Thompson i Dennis Ritchie, którry w latach 1969-1970 opracowali w Bell Laboratories pierwszą wersję systemu. Ich zamiarem było stworzenie wygodnego systemu do wytwarzania oprogramowania, z prostym, ale dającym duże możliwości językiem poleceń oraz niezależnym od urządzeń systemem plików. Następnym etapem w rozwoju systemu było opracowanie języka C, który od tej pory jest nieodłącznie związany z systemem.
Aktualną, najbardziej rozpowszechnioną wersją systemu jest UNIX System V, jakkolwiek większość komercyjnych wersji systemu zawiera również elementy wprowadzone na University of California w Berkeley w wersji BSD Unix 4.2 i 4.3 [6].
Charakterystyczne cechy systemu UNIX są następujące:
• wielodostępność - liczba użytkowników zależy głównie od mocy obliczeniowej sprzętu i wynosi zazwyczaj od 16 do kilkuset,
wieloprocesowość (wielozadaniowość) - jednostkami aktywnymi w systemie są procesy pracujące współbieżnie, przy wykorzystaniu różnych mechanizmów synchronizacji i komunikacji,
hierarchiczny system plików, z jednolitym potraktowaniem plików zwykłych, katalogów i plików opisujących urządzenia zewnętrzne,
wykonywanie operacji wejścia/wyjścia niezależnie od typu urządzeń zewnętrznych, • duża liczba programów narzędziowych, tj. kompilatorów języków programowania (C, Pascal, Fortran 77, Basic, Cobol) wraz z otoczeniem wspomagającym uruchamianie programów,
• duża liczba programów usługowych,
. przenoszenie oprogramowania systemowego dzięki zapisowi w języku C.
Główną wadą systemu jest słownictwo używane w poleceniach systemu UNIX, sposób tworzenia skrótów, a czasami pisownia wyrazów, które na pierwszy rzut oka robią wrażenie dziwacznych. W poleceniach tych korzysta się prawie wyłącznie z małych liter. Istnieją jednak wyjątki - małe litery nie zastępują po prostu dużych.
Omówimy obecnie pokrótce kilka zagadnień dotyczących budowy i działania mechanizmów wewnętrznych systemu UNIX, które różnią ten system od innych. Tworzą one jednocześnie pewną filozofię tego systemu i filozofię współpracy użytkownika z nowoczesnym systemem komputerowym. Użytkownikom, którzy nie są zainteresowani
Rozdział 1.
takim spojrzeniem na ten system operacyjny, a pragną tylko nauczyć się korzystać z niego, proponujemy przejście od razu do punktu 1.2.
Charakterystyczną cechą nowoczesnych systemów operacyjnych jest ich struktura warstwowa. Każdy system operacyjny ma wyodrębnioną część, która realizuje jego najbardziej podstawowe funkcje. Część tę nazywa się zwykle jqdrem systemu albo >7~nrsłwq wewnęirznq. Pozostała część systemu tworzy warstwę zewnętrzną. Podział taki nie jest jednoznacznie ustalony dla wszystkich systemów. W jądrze systemu implementuje się te wszystkie funkcje, które z racji swojej wagi i charakteru muszą być traktowane w uprzywilejowany sposób. W szczególności więc jądro jest odpowiedzialne za: obsługę przerwań, przydział procesora, operacje wejścia/wyjścia. Ponadto w jądrze są implementowane mechanizmy, dzięki którym system komputerowy wraz z jądrem tworzy maszynę bardziej atrakcyjną dla użytkownika, zwaną często maszyną wirtualną lub maszyną rozszerzoną.
Zwykle warstwa zewnętrzna obejmuje procesy użytkowników (w tym miejscu dla uproszczenia możemy przyjąć, że są to po prostu programy użytkowników) i te moduły systemu operacyjnego, które mogą współzawodniczyć z użytkownikami o zasoby w podobny sposób, jak użytkownicy współzawodniczą między sobą. Warstwa zewnętrzna ma niekiedy postać rodziny procesów współbieżnych, zorganizowanych w strukturę hierarchiczną.
Typowym przykładem systemu operacyjnego mającego strukturę warstwową jest właśnie system IJNIX.
Podział na warstwy jest w systemie UNIX bardzo przejrzysty. Jądro systemu, poza czynnościami wspomnianymi powyżej (obsługa przerwań, przydział procesora, wejście/wyjście), realizuje procesy. Ponadto zarządza pamięcią operacyjną i zewnętrzną. Każdej akcji wykonywanej poza jądrem odpowiada pewien proces. Warstwa zewnętrzna systemu LTNIX jest zestawem procesów, które odpowiadają wykonywaniu zarówno programów systemowych, jak i programów użytkowników.
Zl~cze z użNkownikiem Użytkownicy
zyc~e r~nkc~i Programy utytkowe (powloki, edytory, sysremowycn kompilarory etc.)
Tryb użytkownika Funkcje systemowe
(open, close, fork, wait, read, write, exec, exit) Jadro systemu operacyjnego UNIX
TNb
(zarzadzanie pamięcia, procesami i urzadzeniami, system plików etc.) jadra Sprzęt
(procesory, pamięć, dyski, terminale etc.)
Rys. 1.1. Prcykładowa struktura systemu operacyjnego UNIX [14]
Wśród procesów warstwy zewnętrznej specjalną rolę odgrywa tzw. powłoka (ang. shel~. Jest to proces odpowiedzialny za konwersację z użytkownikiem, tzn. interpretujący polecenia wprowadzane z klawiatury terminalu.
Przykładową strukturę systemu operacyjnego LTNIX przedstawiono na rys.1.1.
Wprowadzenie j I
Jak już wspomnieliśmy, jądro stanowi centralną część systemu, realizującą operacje umożliwiające wykonywanie procesów, zarządzanie zasobami oraz stanowi łącznik ze sprzętem. Na rys. 1.1 jądrem systemu jest część znajdująca się pomiędzy złączem funkcji systemowych a sprzętem. Zostało ono napisane głównie w języku C (ok. 10 000 linii kodu) oraz częściowo w języku asemblerowym (ok. 1000 linii kodu - głównie operacje uzależnione maszynowo). Jądro stanowi ilościowo niewielką część systemu, zazwyczaj 5% - 10% całego kodu.
Przeciętny użytkownik nie interesuje się zbyt głęboko budową sprzętu, którym się posługuje przy rozwiązywaniu swojego problemu, ani szczegółami oprogramowania systemowego. Dlatego w systemie LINIX umieszczono osłonę (powłokę) pomiędzy użytkownikiem a komputerem, aby użytkownik komunikował się za pomocą zestawu poleceń systemowych z wirtualną maszyną, której jedyną widoczną częścią jest właśnie program shell, tj. powłoka. Jądro systemu odgrywa podobną rolę, ale na niższym poziomie: ukrywa ono maszynę fizyczną przed programami i zaawansowanymi użytkownikami, chcącymi od czasu do czasu korzystać z usług niskiego poziomu systemu. Chodzi tutaj o wykonywanie operacji, dla których nie istnieją standardowe instrukcje w języku wysokiego poziomu. Są to na przykład operacje: zainicjowania nowego procesu, otworzenia pliku, odczytania zegara systemowego itp. Dostęp do tych operacji uzyskuje się za pomocą funkcji systemowych (ang. system calls). Wywołania funkcji systemowych można traktować jako instrukcje wykonywane przez maszynę wirtualną - można też powiedzieć, że zbiór tych funkcji stanowi maszynę wirtualną. Innymi słowy, wywołania funkcji systemowych są poleceniami dla jądra, tak jak zwykłe polecenia wydawane z terminalu użytkownika są poleceniami dla programu powłoki. Można odwoływać się do nich z programów napisanych w języku C, dokładnie tak, jakby były zwykłymi funkcjami zdefiniowanymi wjęzyku C.
W ramach funkcji systemowych można wyróżnić dwie kategorie dotyczące, odpowiednio, procesów i systemu plików. Proces jest zazwyczaj wykonywanym programem i składa się z: wykonywanego programu, danych, stosu i wskaźnika stosu, licznika rozkazów i innych rejestrów oraz innych informacji niezbędnych do wykonania programu. Taka interpretacja procesu wiąże się z konkretnym środowiskiem, w którym jest on wykonywany. Jeśli jest to system pracujący w trybie podziału czasu, to proces może być czasowo zawieszany, a później restartowany w tym samym stanie, jak przed zawieszeniem. Pojawiają się wobec tego problemy związane z restartowaniem procesu. Na przykład, jeśli korzystał on z kilku otwartych plików, to po jego restartowaniu system operacyjny musi zagwarantować poprawne czytanie danych, to jest od miejsca, w którym nastąpiło zawieszenie procesu. W większości systemów operacyjnych wszystkie informacje o każdym procesie są przechowywane w tablicy procesów. Tak więc proces składa się z przestrzeni adresowej (nazywanej często obrazem pamięci) oraz z zapisów w tablicy procesów (są to przede wszystkim zawartości rejestrów procesora).
Podstawowymi funkcjami w ramach systemu zarządzania procesami są te, które zajmują się tworzeniem i zawieszaniem procesów. Procesem, który czyta zlecenia systemu operacyjnego z terminalu, jest powłoka. Jeśli na przykład użytkownik wprowadzi zlecenie żądające wykonania kompilacji programu, to powłoka musi utworzyć nowy proces, którym będzie kompilacja. Gdy proces ten zakończy kompilację, to wywołuje funkcję systemową zawieszającą go. Niektóre procesy mogą generować nowe procesy - procesy potomne (ang. child processes).
I G lirWrl_in! !.
Z procesami związane są tzw. ,sygraaly (ang. .si~na~. Rozważmy je na przykładzie procesu wysyłającego informację w sieć. Może on ustawić przekaźnik czasowy (ang. timer) określający czas oczekiwania na potwierdzenie odbioru komunikatu i dalej wykonywać inne prace. Jeśli po upływie tego czasu nie nadejdzie potwierdzenie odbioru komunikatu przez adresata, to można przyjąć, że informacja została gdzieś w sieci utracona. W tej sytuacji system operacyjny wysyła do procesu sygnał. Powoduje on czasowe zawieszenie procesu (niezależnie od tego, co on wykonywał w danej chwili), zapamiętanie stanu jego rejestrów na stosie i wystartowanie procedury obsługi sygnału, w tym przypadku zajmującej się retransmisją utraconej informacji. Po wykonaniu modułu obsługi sygnału proces jest restartowany w stanie sprzed otrzymania sygnału. Sygnały są programowym odpowiednikiem przerwań na poziomie sprzętu.
Każda osoba pracująca w systemie ma identyfikator - r~ic! (ang. n.ser identification), każdy proces rozpoczynający pracę w systemie - identyfikator użytkownika, który go zainicjował, a procesy potomne - identyfikatory ich procesów m acierzystych.
Druga kategoria funkcji systemowych jest związana z systemem plików. Są to wywołania niezbędne do tworzenia, usuwania, czytania i zapisywania, otwierania i zamykania plików oraz tworzenia i usuwania katalogów.
Hierarchia procesów i plików jest zorganizowana w postaci drzewa, lecz podobieństwo w tym momencie się kończy, bowiem hierarchia procesów nigdy nie jest zbyt głęboka (do 3 poziomów) i zazwyczaj jest krótkotrwała (do kilku minut).
Każdy plik jest identyfikowany przez podanie nazwy .ścieżki dosl4rpn (ang. path name), prowadzącej od katalogu korzenia do pliku. Scieżki rozpoczynające się od katalogu korzenia są nazywane ścieżkami absolutnymi. Zawierają one listę katalogów, przez które należy przejść w poszukiwaniu danego pliku, a rozpoczynają przeszukiwanie od katalogu korzenia. Nazwy katalogów są oddzielone znakiem slash - ukośną kreską. Ukośna kreska (/) na początku ścieżki wskazuje, że jest to ścieżka absolutna. Każdy proces może posiadać swój katalog bieżący, w którym nazwy ścieżek nie rozpoczynają się od ukośnej kreski. System operacyjny UNIX nie pozwala, aby ścieżka była poprzedzona nazwą lub numerem napędu dyskowego. Tak więc, aby móc wykorzystać w systemie katalog znajdujący się na dyskietce, należy najpierw przyłączyć go do katalogu korzenia, który zazwyczaj znajduje się na dysku twardym.
Pliki i katalogi w systemie UNIX są chronione 9-bitowym kodem ochronnym. Pozwolenie na czytanie lub zapisywanie pliku jest sprawdzane podczas jego otwierania. Jeśli dostęp jest dozwolony, system wysyła do procesu deskryptor pliku, wykorzystywany w kolejnych operacjach.
W systemie UNIX wyróżniono tak zwane pliki .specjalne. Pozwalają one na widzenie urżądzeń wejścia/wyjścia tak, jakby to były zwyczajne pliki. W ten sposób operacje zapisu i odczytu z tych urządzeń mogą być wykonywane z wykorzystaniem tych samych wywołań systemowych, które dotyczą zapisu i odczytu plików.
6G'prowad=ginie f! 3
Komunikowanie się z systemem
System operacyjny UNI?~ może równocześnie obsługiwać wielu -~ ~ uprawnionych do korzystania z niego użytkowników. Uprawnienia przyznaje użytkownikom administrator systemu. Ustala on również
hasła i przynależność użytkowników do grup, tworzy systemy plików i załatwia inne sprawy organizacyjne wynikające ze wspólnego użytkowania jednego komputera. Pierwszym krokiem przyszłego użytkownika powinna więc być wizyta u administratora, w celu otrzymania stosownych uprawnień. Administrator systemu przyznaje każdemu użytkownikowi nazwę (zwaną także identyfikatorem użytkownika) oraz ha.slo. Nazwą jest zazwyczaj imię lub nazwisko użytkownika, ma ona jednak ograniczoną długość (zazwyczaj do ośmiu znaków). Użytkownicy systemu UNIX mogą porozumiewać się między sobą za pomocą różnych technik przesyłania komunikatów. Nazwa użytkownika służy wówczas jako adres.
Hasło jest natomiast znane tylko użytkownikowi i może być przez niego zmienione w dowolnej chwili dla zachowania sekretu. Nawet administrator nie może odczytać stosowanego hasła.
W wielu instalacjach systemu UNIX administrator określa przynależność użytkownika do jakiejś grupy użytkowników. Jest nią zazwyczaj grupa ludzi związanych wspólnymi celami albo ramami organizacyjnymi, co wynika z jej nazwy, np. nauczyciele (ang. teachers) i studenci (ang. .sludents). Przed omówieniem rozpoczęcia pracy z systemem zajmiemy się opisem korzystania z klawiatury.
Znaki wprowadzane z klawiatury nie są natychmiast interpretowane. Magazynuje się je (umieszcza w buforze) aż do napotkania znaku końca wiersza (klawisz Return, E.riler lub CR). System UNIX próbuje przeczytać i zrozumieć wiersz wprowadzony z klawiatury dopiero wówczas, gdy jest on zakończony. Pozwala to poprawiać na bieżąco błędy wynikłe z naciśnięcia niewłaściwych klawiszy. Innymi słowy, dopóki łańcuch znaków wprowadzany z klawiatury znajduje się w buforze, można go modyfikować za pomocą klawiszy Backspace (BS) oraz Ctrl-u.
Znak niewłaściwie wprowadzony można poprawić za pomocą klawisza Backspace likwidującego znaki na lewo od aktualnej pozycji kursora. Klawisz Del umożliwia przerwanie aktualnie wykonywanej akcji (np. zbyt długiej kompilacji) i powoduje zgłoszenie się systemu.
W systemie UNIX, podobnie jak w wielu innych systemach operacyjnych, korzysta się ze wszystkich widocznych znaków dostępnych na klawiaturze, a także ze zbioru niewidocznych znaków sterujących. Te ostatnie powstają w wyniku naciśnięcia odpowiedniego klawisza przy wciśniętym klawiszu Ctrl (CorTtrol). Klawisz Ctrl działa podobnie jak klawisz Shrft, tzn. zmienia znaczenie innych klawiszy. Naciśnięcie samego klawisza ('trl nie daje żadnego efektu, tak jak naciśnięcie samego klawisza Shift. Najczęściej używanymi znakami sterującymi są: Ctrl-d - na ogół oznaczający koniec aktywności i służący wobec tego do pożegnania się z systemem; Ctrl-s - zawieszający chwilowo wypisywanie informacji na terminalu; wreszcie Ctrl-q - wznawiający wypisywanie informacji zawieszone przez znak Ctrl-.s.
Poniższe zestawienie podaje funkcje klawiszy wykorzystywanych w systemie UNIX.
Rozdzial 1.
Klawisz Funkcja
(,'lrl-s wstrrymywanie wyświetlania,
('lrl-g kontynuacja wyświetlania.
F.nter akceptacja napisanej linii,
BS usuwanie ostatniego znaku,
(.'lrl-n usuwanie ostatniej linii,
Del przerwanie akcji,
('lrl-d koniec pliku.
Użytkownik ma do dyspozycji zazwyczaj końcówkę systemu (terminal), która wyposażona jest standardowo w monitor ekranowy oraz klawiaturę. Terminal połączony jest z komputerem centralnym zwykle za pomocą złącza szeregowego (RS232C). W momencie inicjacji systemu uruchamiane są procesy obsługi złącz szeregowych do terminali (l;elly), które powodują włączenie użytkownika do systemu (loRin) [7].
Wszystkie dołączone 'do systemu terminale wyświetlają monit (ang. prompt), zwany również zachętą do zgłoszenia się, a następnie czekają na odpowiedzi pracujących przy nich użytkowników. Monit pojawia się po lewej stronie ekranu i w najprostszej postaci jest to
Jogin: Użytkownik zgłasza się wpisując z klawiatury swoją nazwę, nadaną mu przez administratora systemu, oraz znak końca wiersza (Enter). Jeśli nazwa użytkownika została wprowadzona prawidłowo, w większości implementacji systemu LJNIX zostanie wyświetlone żądanie wprowadzenia hasła, które należy podać dokładnie w takiej postaci, jaką uzgodniono z administratorem. Na większości terminali wprowadzane hasło się nie pojawia. Jeśli hasło jest poprawne, zgłoszenie zostanie przyjęte i użytkownik może korzystać z systemu. Jeśli hasło jest niewłaściwe bądź nazwa jest nieznana, system odmawia współpracy.
Po zakończeniu procedury zgłaszania się UNIX informuje użytkownika o swojej gotowości do przyjmowania poleceń wypisując z lewej strony ekranu monit systemowy (jest to najczęściej znak dolara - $). W większości systemów użytkownikowi wolno zdefiniować własną postać monitu.
Zakończenie pracy w systemie UNIX jest mocno zróżnicowane - w zależności od wersji systemu. Pożegnanie z system UNIX może polegać na wprowadzeniu jednego z następujących słów: exit, bye, off, goodbye, arriaederci itp. Jednakże w większości wersji systemu UNIX pracę kończy się wprowadzając znak Clrl-d. Choć niektóre systemy wypisują krótki komunikat o zerwaniu więzi z systemem, odpowiedzią na znak Ctrl-d jest na ogół po prostu słowo "Jogin: ", oznaczające, że system pożegnał się i jest gotów do przyjęcia następnego zgłoszenia. Taki dość dziwny sposób pożegnania z UNIX-em jest w gruncie rzeczy uzasadniony. Znaku ('!rl-d używa się w całym oprogramowaniu systemu UNIX do oznaczenia końca pliku. Wiele programów usługowych, czekając na dane z klawiatury, traktuje go w ten właśnie sposób. Znak Clrl-d wprowadzony z klawiatury jest zatem rozpoznawany jako koniec transmisji z klawiatury.
Proponujemy obecnie Czytelnikom pierwszą inauguracyjną sesję prry terminalu. Jej celem będzie przećwiczenie przede wszystkim czynności, które należy wykonać, aby rozpocząć i zakończyć pracę z systemem LJNIX.
Wprowadzenie
IS
Zanim jednak Czytelnik zasiądzie przy terminalu, musi złożyć wizytę administratorowi systemu w celu uzgodnienia omówionych powyżej formalności, które pozwolą na korzystanie z systemu. Administrator powinien utworzyć katalog /usr/students/studentl, który dalej będzie katalogiem osobistym (ang. home directory) użytkownika. W katalogu studentl powinny się znaleźć dwa dowolne pliki (mogą być puste) o nazwach bez_zapisu i bez odczytu, przy czym jeśli chodzi o pierwszy z nich, to użytkownik nie powinien posiadać prawa pisania w tym pliku, natomiast w przypadku drugiego pliku - prawa czytania tego pliku. Wspomniany wyżej katalog i pliki będą wykorzystywane w dalszej części podręcznika i w kolejnych sesjach przy terminalu.
Sesja nr 1 przy terminalu
1 . Zarejestruj się w systemie (login).
2. Przy wprowadzaniu poleceń wymienionych w punktach od 3 do 6 celowo popełnij pewne błędy, a następnie spróbuj je usunąć wykorzystując omówione wcześniej klawisze. Przypomnijmy, że błędy te możesz usunąć tylko przed naciśnięciem klawisza akceptacji Enłer.
3. Wyświetl bieżącądatę (polecenie: date).
4. Wyświetl kalendarz na dany miesiąc (polecenie: cal). 5. Sprawdź, kto pracuje w systemie (polecenie: who). ó. Sprawdź swój kod identyfikacyjny (polecenie: id).
7.. Zakończ sesję przy terminalu.
Edytor vi
Charakterystyka edytora vi
Spośród wielu edytorów pracujących pod kontrolą systemu operacyjnego Ur1IX dwa ryskały szczególną popularność. Są to
edytory vi oraz ed. Najczęściej stosowanym edytorem,'dla potrzeb prac systemowych jest edytor vi. Niestety, nie cieszy się on zbyt dobrą opinią wśród użytkowników, z kilku powodów. Niektórry autorzy [3] uważają, że edytora vi nie używa się, jeśli nie jest to konieczne. Otóż to - jeśli nie jest to konieczne. Faktem jest, że wielu użytkowników tego systemu niestety musi go używać. Jego znajomość w systemie UNIXjest istotna o tyle, że jest to edytor dostępny nie tylko z poziomu wielu poleceń systemu, ale również dlatego, że wywoływany jest on automatycznie z poziomu menu administratora systemu w przypadku wyrażenia chęci wprowadzenia zmian w plikach systemowych. Jest to typowy edytor ekranowy, z bardzo bogatym repertuarem poleceń, w wielu przypadkach bardzo podobnych do siebie. Sprawia to, że obsługa edytora wydaje się na początku skomplikowana i nieprzejrzysta. Co więcej, identyczne wyniki można uzyskiwać stosując różne polecenia lub zastępując je zestawem bardziej elementarnych poleceń. Źródeł podobieństwa poleceń należy szukać w historii. Otóż edytor vi pojawił się w czasach komputerów wielodostępnych, które bardzo wolno obsługiwały dużą liczbę nieinteligentnych terminali. W takich warunkach sprzętowych tendencja do maksymalnej koncentracji możliwości jednego polecenia wydaje się naturalna. Innymi słowy, w okresie, gdy powstawał edytor, starano się komasować jak najwięcej funkcji w różnych wariantach w jednym poleceniu, stąd wielość mało różniących się poleceń. Użytkownikowi nie pozostaje zatem nic innego, jak zignorowanie istnienia wielu podobnych poleceń i wybranie spośród nich tylko tych, które mu najbardziej odpowiadają. Podobnie postąpili autorzy tego podręcznika i wybrali do omówienia zestaw elementarnych, najczęściej wykorzystywanych poleceń, a pominęli wiele poleceń pochodnych. Dodatkową trudność w korzystaniu z edytora vi może stanowić fakt, że nie we wszystkich typach terminali można wykorzystywać klawisze kierunkowe (oznaczone strzałkami), przeznaczone do przemieszczania kursora. Wynika to z tego, że w edytorze vi znak Esc ma znaczenie szczególne i oznacza zmianę trybu pracy, a naciśnięcie klawiszy oznaczonych strzałkami powoduje wygenerowanie niekiedy sekwencji znaków sterujących rozpocrynających się od tego symbolu.
Przetwarzany tekst, zapisany w pliku, jest najpierw wczytywany do bufora tekstowego (wydzielony obszar w pamięci operacyjnej komputera), tam zmieniany zgodnie z żądaniami użytkownika, a w końcu zapisywany ponownie w oryginalnym
Edvtor vi % %
pliku. Wszystkie operacje przeglądania i modyfikowania tekstu dotyczą zatem zawartości bufora. W przypadku małych plików bufor mieści się całkowicie w pamięci operacyjnej. Dla dużych plików jest on dzielony na dwie części, z których jedną fizycznie umieszcza się w pamięci, drugą natomiast przechowuje w pliku tymczasowym. Przesyłanie fragmentów tekstu między obiema częściami buforu odbywa się automatycznie, w sposób niewidoczny dla użytkownika (rys. 2.1).
Rys. 2.1. Prcesytanie fragmentów tekstu między częściami bufora tekstowego 1 I ~
Polecenia i tryby pracy
Edytor vi został przystosowany do przetwarzania tekstu podzielonego na pojedyncze wiersze. Dzięki temu jest szczególnie przydatny do przygotowywania tekstów programów. Można go również wykorzystywać do opracowywania innych materiałów tekstowych. Jednakże w tym przypadku użytkownik musi pamiętać o konieczności kończenia każdego wiersza znakiem l:nter~ (zazwyczaj wiersz nie może być dłuższy niż 80 znaków). Z obsługą wierszy dłuższych niż określone edytor vi nie potrafi sobie poradzić.
Edytor vi wywołuje się poleceniem: vi raa~~a plikrt, przy czym nawa plika jest nazwą modyfikowanego lub nowo tworzonego pliku. Edytor wczytuje zawartość pliku i wyświetla na ekranie początek tekstu (tyle wierszy tekstu, ile się mieści na ekranie). Nowo tworzony plik oczywiście początkowo nie zawiera żadnych znaków. Wobec tego edytor wypisuje cały ekran pustych wierszy, każdy ze znakiem tyldy "~" z lewej strony. Nazwa pliku pojawia się na dole ekranu, w ostatnim wierszu zarezerwowanym dla komunikatów systemowych. Następnie edytor czeka na polecenia użytkownika.
l8 Rozdział 2.
Zasadniczo można wyróżnić dwa tryby pracy edytora:
lryh lu~leceri - w którym edytor vi interpretuje znaki wpisywane przez użytkownika z klawiaturyjako fragmenty poleceń,
. Tryb w.~~tawia~iia - w którym przekazywane ciągi znaków są umieszczane w przetwarzanym tekście.
Wejście w tryb poleceń następuje automatycznie po wywołaniu edytora. Przejście z trybu poleceń do trybu wstawiania następuje po podaniu jednej z komend służących do dołączania tekstu. Na przykład wydanie polecenia i (ang. insert - wprowadź) spowoduje, przejście edytora w tryb wstawiania i wszystkie kolejne znaki podawane przez użytkownika będą umieszczane w buforze tekstowym. Powrót do trybu poleceń (z trybu wstawiania) nastąpi dopiero po wciśnięciu klawisza Esc. Wciśnięcie tego klawisza, gdy edytor jest w trybie poleceń, powoduje wydanie sygnału dźwiękowego. Można więc w ten sposób sprawdzić tryb pracy edytora w danej chwili.
Wszystkie działania edytora są sterowane poleceniami z klawiatury. Użytkownik ma do dyspozycji polecenia umożliwiające dodawanie, usuwanie i wymianę tekstu w buforze, wyszukiwanie ciągu znaków, manipulowanie plikami i wiele innych. Tekst większości wprowadzanych poleceń nie pojawia się na ekranie terminalu. Tylko w niektórych przypadkach ich echo pojawia się w ostatnim wierszu ekranu. Polecenia są zazwyczaj jednoliterowe, jednak do wielu poleceń trzeba dołączyć pewne parametry. Niepełną sekwencję polecenia można w każdej chwili unieważnić znakiem Esc. Klawisz Dcl (ang. delete - usuń) służy do przerywania polecenia wykonywanego w danej chwili. Powrót edytora do poprzedniego stanu nastapi nawet wtedy, gdy polecenie jest jus częściowo wykonane. Chcąc natomiast usunąć wyniki już wykonanych poleceń, musimy posłużyć się poleceniem u. Jeśli zatem po wykonaniu danego polecenia użytkownik wyda polecenie u, edytor powróci do stanu sprzed wykonania danego polecenia. Co więcej, ponowne wprowadzenie u spowoduje powtórne wykonanie polecenia, gdyż w tym kontekście oznacza odwołanie poprzedniego polecenia u.
f~
Wprowadzanie i poprawianie tekstu
a~ Aby wstawić tekst do bufora, należy przejść z trybu poleceń do trybu wstawiania. Proponujemy wykorzystywanie do tego celu dwóch
poleceń: i oraz a (ang. append - dodawanie). Parametrem tych poleceń jest tekst, który należy wstawić przed lub dodać po znaku wskazanym przez kursor. Polecenie wstawiania tekstu trzeba zakończyć wciśnięciem klawisza Esc.
Do poprawiania błędów służą specjalne polecenia usuwające zbędne znaki i wstawiające nowe. Znak wskazany przez kursor usuwa się poleceniem x, a znak poprzedzający go - poleceniem X. Nowy znak natomiast wstawia się opisanym już poleceniem i. Polecenie r (ang. replace - wymień) usuwa znak wskazany przez kursor i powoduje przejście do trybu wstawiania, pozwalając wstawić tylko jeden znak. Znak ten jest wówczas wstawiany w miejsce usuniętego, po czym następuje automatyczne przejście do trybu poleceń (znak Esc jest tu zbędny).
Powtórzenie ostatnio wykonywanego polecenia modyfikującego zawartość buforu tekstowego można w prosty sposób osiągnąć korzystając ze specjalnego polecenia w postaci . (kropki), powodującego powtórzenie ostatnió wykonanej akcji. Trzeba tu
Edyror Vr 19
wyraźnie zaznacryć, że polecenie powtarzania odnosi się tylko i wyłącznie do poleceń modyfikujących zawartość buforu tekstowego. Zawsze jest powtarzane ostatnio wykonywane polecenie modyfikujące bufor. Należy o tym szczególnie pamiętać, gdy po modyfikacjach tekstu kursor został przesunięty w inne miejsce ekranu. Wykonanie polecenia . może wówczas przynieść zaskakujące rezultaty.
Obecnie proponujemy Czytelnikowi kolejną sesję przy terminalu, która będzie obejmować ćwiczenia dotyczące zagadnień związanych z zakładaniem plików tekstowych i wykonywaniem poprawek w tekście. Pliki, które będą wykorzystywane w kolejnych ćwiczeniach przy terminalu, są z założenia bardzo proste. Założenie takie przyjęto, by Czytelnik nie tracił zbyt wiele czasu na ich wpisywanie. Pierwszy z tych plików, po wykonaniu wsrystkich ćwiczeń dotyczących edytora vi, powinien składać się z samych liter a (małe a), natomiast drugi - z samych liter b. Tak więc, na początku ćwiczeń z edytorem vi wszystkie inne znaki występujące w plikach należy traktować jako błąd. Naszym zadaniem w kolejnych sesjach będzie usuwanie tych błędów ściśle według określonych wskazówek. Jednakże, aby to wykonać, musimy najpierw wprowadzić te pliki z pewnymi błędami. Jest to na pierwsry rzut oka postępowanie irracjonalne, lecz z drugiej strony jest to najprostszy i jednocześnie najskuteczniejszy sposób przećwiczenia poleceń edytora vi.
Do wykonania modyfikacji i poprawek tekstu, oprócz zagadnień omówionych powyżej, niezbędna jest również znajomość podstawowych poleceń dotyczących przesuwania kursora na ekranie. Zostaną one szczegółowo omówione w dalszej części rozdziału, tutaj ograniczymy się jedynie do ich wyszczególnienia. Są to następujące polecenia:
• Ctrl-m lub + - przesunięcie kursora o linię w dół, - przesunięcie kursora o linię w górę, - przesunięcie kursora o znak w lewo, - przesunięcie kursora o znak w prawo,
- przesunięcie kursora w górę o 1/2 ekranu.
h
• spacja • Ctrl-u
Sesja nr 2 przy terminalu
~ . Zarejestruj się w systemie.
2. Wywołaj edytor vi. Nazwa przetwarzanego pliku tekstowego: tekst a 3. Przejdź do trybu wstawiania (polecenie: i) i wprowadź do bufora tekstowego około 35 wierszy zawierajacych same litery małe a z kilkoma następujacymi wyjątkami:
niech w pierwszym wierszu brakuje w wybranym przez Ciebie miejscu litery a (zastępujemy ja spacji oraz niech znajda się tam dodatkowe litery, np. XXoraz C,
niech w trzecim wierszu brakuje kilku liter a i niech znajduja się tam dodatkowo ZZZ,
niech również w piatym wierszu brakuje kilku liter a,
w ósmym wierszu na dziewiątej pozycji licząc od lewej krawędzi ekranu umieść literę 8; tę samą literę umieść w wierszu dziewiatym na pozycji dziesiątej,
llo~dzinł 1.
wiersz jedenasty rozpocznij od słów ALA MA KOTA; podobny tekst, tj. ALA MA KOTA I PSA, umieść pod koniec trzynastego wiersza,
niech wiersz czternasty będzie wierszem pustym,
w wierszu piętnastym umieść obok siebie cztery litery YYYY, w wierszu szesnastym słowo (z błędem) opercayjnej, natomiast w wierszu siedemnastym - cztery litery XXXX,
w wierszu osiemnastym umieść zdanie Unix !! To jest to !!
ostatnie pięć wierszy powinno składać się z samych liter duże A i tworzyć paragraf zaczynający się od akapitu.
Wprowadzenie tekstu składającego się z liter a wraz z powyższymi "błędami" prosimy potraktować jako ćwiczenia z klawiaturą.
4. Przejdź do trybu poleceń (l.sc) i usuń błędy znajdujące się w pierwszych pięciu wierszach tekstu. Wykorzystaj w tym celu omówione wcześniej polecenia: Ctrl-m, h, spacja oraz i, a, x, X, r, . (kropka).
5. Zakończ edycję poleceniem ZZ. 6. Zakończ sesję przy terminalu.
w..,. :::2,.. ;~,: ,:`::~".:'
operacje na fragmentach tekstu
Większość poleceń edytora vi dotyczy całych fragmentów tekstu, przy czym przez to pojęcie będziemy rozumieć ciąg znaków ograniczony z jednej strony znakiem wskazanym przez kursor, a z drugiej pewnym określonym znakiem znajdującym się gdzieś w pliku, nazywanym dalej ogranicznikiem.
Polecenia dotyczące fragmentów tekstu mają określoną składnię: [[nazwa_buforu] symbol_polecenia] ogranicznik
Symbol polecenia można pominąć, natomiast ograriic_nik należy podać zawsze (wynika to bezpośrednio z definicji fragmentu tekstu). Innymi słowy, specyfikacja czynności, którą edytor ma wykonać na zdefiniowanym za pomocą ogranicznika fragmencie tekstu, jest opcjonalna. Opcjonalna jest również nazwa tymczasowego buforu, w którym edytor ma szukać wskazanego fragmentu.
Jak już wspomnieliśmy, ograr~ic~nik określa skrajny znak fragmentu tekstu. Może być nim dowolnie wybrany znak, zawsze jednak należy go jednoznacznie wskazać. Mechanizm ograniczników edytora vi jest bardzo bogaty, tutaj ograniczymy się do podstawowych symboli ograniczników. Jednakże zbiór tych symboli będzie na tyle bogaty, że pozwoli użytkownikowi na wykonywanie wszystkich operacji na fragmentach tekstu spotykanych w praktyce.
Znaczenia większości przedstawionych w tablicy 2.1 ograniczników nie trzeba chyba wyjaśniać. Wyjątek stanowi ostatni, wykorzystujący tak zwany znacznik. Podczas pracy z dużymi plikami tekstowymi często zachodzi potrzeba odwoływania się do
L~rar v~ 2l
odległych miejsc. Aby uniknąć kłopotliwego wyszukiwania takich miejsc, edytor vi zaopatrzono w mechanizm znaczników umożliwiający zaznaczenie określonego miejsca w pliku. Znacznikiem staje się wskazana pozycja wewnątrz tekstu, którą oznacza się wybranym pojedynczym znakiem. Do wstawiania znaczników w miejscu wskazanym przez kursor służy polecenie m, np. mx. Mimo że znak x nie będzie częścią tekstu, to w każdej chwili można przenieść kursor w miejsce, gdzie ten znak wstawiono wykorzystując w tym celu ogranicznik 'x. Należy pamiętać o tym, że znaczniki są przechowywane w pliku tylko na czas sesji - nie są zapamiętywane na stałe.
Ograniczniki
T~bIICA Z.l
Symbol ogranicznika Znaczenie
h znak z lewe stron
.s ac a znak z rawe stron
0 oczątek dane ~o wiersza
~ś koniec dane ro wiersza
- oczątek o rzednie =o wiersza
+ oczątek nastę ne =o wiersza
G początek ostatniego wiersza w
liku
nG oczątek rr-te 7o wiersza w liku
laaaErzter wystąpienie ciągu znaków acrcr
z rawe stron
?aaaEnter wystąpienie ciągu znaków cracr
z lewe stron
' x oczątek wiersza ze znacznikiem x
Specyfikację wiekszości ograniczników można poprzedzić współczynnikiem rr (bez żadnych oddzielających spacji), tj. liczbą wskazującą, o które wystąpienie danej sytuacji nam chodzi.
Ogólna postać ograniczników będzie zatem następująca
współczynnik symbol ogranicznika
Współczynników nie wolno stosować wraz z ogranicznikami jednoznacznymi w skali pliku. Takimi wyjątkami są:
0 - początek danego wiersza, S - koniec danego wiersza,
ź - początek wiersza zawierającego znacznik x.
Na początku tego paragrafu określona została składnia poleceń operujących na fragmentach tekstu. Otóż wszystkie te polecenia wykonują, jeśli to konieczne, pewną operację na fragmencie opisanym ogranicznikiem, a następnie przesuwają kursor do znaku wskazanego przez ogranicznik. Tak więc wynikiem polecenia nie zawierającego specyfikacji czynności będzie jedynie przesunięcie kursora Stąd aby przesunąć kursor w miejsce wskazane przez ogranicznik, wystarczy w trybie poleceń wydać spec~tikację ogranicznika.
22 Rozdział 2.
W tym momencie staje się jasne, dlaczego edytor vi nie zawiera oddzielnych poleceń służących do przesuwania kursora -ich rolę pełnią ograniczniki jednoznacznie wskazujące określone miejsca w pliku.
Tekst zawarty w buforze, widoczny na ekranie terminalu, można przesuwać operując tak zwanym oknem. Mianowicie ekran terminalu lub jego część jest oknem, przez które widać bufor tekstowy. Okno można przesuwać wzdłuż tekstu w dwóch kierunkach: w przód i w tył, prry czym wyrażeń w przód (lub inaczej w dól) używa się do określenia kierunku przesuwania okna w stronę końca tekstu, natomiast słów w tyl i w girę w stronę początku tekstu. Istnieją cztery polecenia operujące na oknach:
('trl f - przesunięcie w przód o długość okna, ('łrl-b - przesunięcie w tył o długość okna, (.'trl-d - przesunięcie w przód o część okna, (.'trl-u - przesunięcie w tył o część okna.
Warto tutaj zwrócić uwagę, że jeśli tekst "widoczny" w oknie jest krótsry od długości okna, to poleceń Ctrl j i Ctrl-b nie można wykonać (system po prostu nie reaguje na te polecenia w takiej sytuacji). Początkowo część okna oznacza połowę ekranu. Wielkość tę można zmienić podając liczbę wiersry przed poleceniami Ctrl-d i Ctrl-u. Brak takiej specyfikacji oznacza prryjęcie ostatnio podanej liczby wierszy.
W ramach następnej sesji prry terminalu przećwiczymy operacje przesuwania kursora i okna oraz dodatkowo edycję pliku.
Sesja nr 3 przy terminalu
1 . Zarejestruj się w systemie.
2. Wywołaj edytor vi. Nazwa przetwarzanego pliku tekstowego: tekst a
3. Sprawdź działanie poleceń przesuwających kursor (ograniczników), tzn. wykonaj następuj~,cą sekwencję czynności:
przesuń kursor na pocz~tek ostatniego wiersza w pliku tekst a (G),
• przesuń kursor na pocz~,tek pierwszego wiersza w pliku (1G), • przesuń kursor na poczatek dziewiatego wiersza (9G),
• przejdź do 10. znaku w prawo od aktualnej pozycji kursora (70spacja)
• wykonaj odpowiednia poprawkę w tekście,
• przejdź do poczatku wiersza, w którym znajduje się kursor (0 zero),
• przesuń kursor na poczatek poprzedniego wiersza (-),
wykonaj odpowiednią poprawkę w tekście (na 9. pozycji litera 8), • przejdź do następnego wiersza (+),
• znajdź w tekście cia„gi znaków XXX)C (lXXXXEf~ter) i YYYY (lYYYYEnter lub ?YYYYEr~ter itd.) i wykonaj odpowiednie poprawki w tekście,
• zbadaj reakcję systemu, jeśli poszukiwanie ci~gu znaków (np. CCC) kończy się niepowodzeniem,
wstaw znacznik w na poczatku pliku (mw),
~:yvr~~r ~~r 23
wykorzystujac już przećwiczone polecenia przejdź do poczatku paragrafu rozpoczynajacego się od akapitu (duże litery A) i wstaw tam znacznik y,
wykorzystaj znaczniki w i y do szybkiego przesuwania kursora po tekście,
4. Zakończ edycję poleceniem ZZ. 5. Zakończ sesję przy terminalu.
Ograniczniki służą do definiowania nie tylko miejsca docelowego kursora, lecz także zakresu działania kilku innych poleceń edytora vi. Są nimi polecenia usuwania, przesuwania i zmiany fragmentów tekstu.
Usuwany fragment tekstu jest z jednej strony ograniczony bieżącą pozycją kursora, a z drugiej znakiem wskazanym jako ogranicznik. Ogólna postać polecenia usuwania fragmentu tekstu jest następująca:
d ogranicznik
W wyniku wykonania polecenia usuwania d wszystkie znaki, począwszy od wskazanego przez kursor, a skończywszy na wskazywanym przez ogranicznik, są usuwane. Przykładowo wynikiem wykonania następujących poleceń będzie odpowiednio: d0 - usunięcie znaków do początku danego wiersza,
d5h - usunięcie pięciu kolejnych znaków na lewo od bieżącej pozycji kursora, dG - usunięcie reszty pliku,
d'x - usunięcie znaków aż do początku wiersza zawierającego znacznik x.
Edytor vi jest dodatkowo wyposażony w polecenia, które pozwalają na usunięcie bieżącego wiersza oraz bieżącego wiersza i rr-I kolejnych. Są to odpowiednio polecenia: dd oraz dnd.
Usuwane fragmenty tekstu trafiają do bufora. Można je odtworzyć (wstawić w to samo miejsce) za pomocą pólecenia u, pod warunkiem, że nie została jeszcze wykonana następna operacja usuwania.
Wstawianie tekstu w dowolnym innym miejscu pliku umożliwia natomiast polecenie p. Pozwala ono wstawić tekst znajdujący się w buforze w miejsce wskazane przez kursor. Dzięki temu można przenosić fragmenty tekstu z jednego miejsca w pliku w drugie. Trzeba wówczas usunąć dany fragment tekstu, przesunąć kursor w żądane miejsce, a następnie wydać polecenie p.
Sesja nr 4 przy terminalu
~ . Zarejestruj się w systemie (login).
2. Wywołaj edytor vi. Nazwa przetwarzanego pliku tekstowego: tekst a
3. Odszukaj fragment tekstu rozpoczynajacy się od ciagu znaków ALA wykorzystujac w tym celu polecenie lALAEmer. Ustaw kursor na końcu słowa KOTA w tymże wierszu. Usuń wszystkie znaki do poczatku tego wiersza (d0 - dzero). Uzupełnij skasowane znaki literami a.
Il~rr(~inl ?.
4. Ustaw kursor na początku słowa ALA. Usuń 18 kolejnych znaków w prawo od bieżącej pozycji kursora (dl8spacja). Uwaga ! Wprowadzenie d18 bez spacji na końcu spowoduje skasowanie 18 linii. Uzupełnij ten wiersz brakującymi literami a.
5. Przejdź do następnego wiersza (wiersz pusty). Usuń ten wiersz (dd). 6. Wstaw znacznik b na początku 25. wiersza pliku.
7. Ustaw kursor na ostatnim znaku w 30. wierszu pliku. Usuń fragment tekstu ograniczonego bieżącą pozycją kursora i początkiem wiersza zawierającego ogranicznik b (d'b). Odtwórz ten fragment poleceniem u.
ó. Przesuń kursor na początek wiersza zaczynającego się od akapitu (5. wiersz od końca pliku). Usuń resztę pliku (dG). Przejdź kilka wierszy powyżej i wstaw tam usunięty fragment (p). Ponownie usuń resztę pliku od bieżącej pozycji kursora.
9. Odszukaj w pliku słowo opercayjnej. Wykorzystaj polecenie p do przestawienia znaków w tym słowie. Ustaw kursor na literze c i wykonaj polecenie x. Powstanie ciap znaków operayjnej z kursorem wskazującym literę a. Wydanie polecenia p spowoduje wstawienie litery c za znakiem wskazanym przez kursor, czyli we właściwym miejscu. Usuń ten wiersz.
~ ~. Poleceniem 71 zakończ edycję i sesję przy terminalu.
.. ;a,<::::;::
~~ż
Do tej pory rozważany był tylko jeden bufor tekstowy. Tak naprawdę jest ich dziewięć. Polecenie d umieszcza dany fragment tekstu w pierwszym buforze. Kolejne wywołania tych poleceń powodują przeniesienie fragmentów tekstu do buforów o wyższych numerach, tj. zawartość pierwszego buforu do drugiego, drugiego do trzeciego itd. Aby odzyskać tekst z określonego bufora, należy poprzedzić specyfikację polecenia p identyfikatorem danego buforu. Bufory są ponumerowane od "1 do "9. Na przykład polecenie w postaci "3p służy do wstawienia fragmentu tekstu znajdującego się w trzecim buforze w miejsce wskazywane przez kursor. Zwróćmy tu uwagę, że polecenie u kasuje zawartość pierwszego bufora.
Oprócz 9 buforów wykorzystywanych przez edytor vi istnieje dodatkowo 26 buforów wykorzystywanych przez użytkownika (edytor nie wykonuje na nich żadnych operacji bez wyraźnego polecenia ze strony użytkownika). Bufory te identyfikowane są kolejnymi literami alfabetu od a do z, poprzedzonymi cudzysłowem ". Użytkownik może zapisać w dowolnie wybranym buforze fragment tekstu usuwany poleceniem d. Na przykład chcąc usunąć i wpisać bieżący wiersz do bufora k należy wydać polecenie "kdd. Fragment tekstu pamiętany w danym buforze można wstawić w dowolnie wybrane miejsce w pliku poleceniem p (np. "kp). Można w ten sposób kopiować fragmenty tekstu, jest to jednak dość uciążliwe, ponieważ usunięty fragment tekstu należy wstawić w poprzednie i nowe miejsce. Tak więc w celu kopiowania fragmentów tekstu lepiej wykorzystywać polecenie y służące do umieszczania fragmentu tekstu w wybranym buforze. Polecenie y kopiując specyfikowany fragment tekstu do bufora pozostawia bufor tekstowy w nie zmienionej postaci. Postać tego polecenia jest następująca:
Edytor vi 25
y ogranicznik
Edytor vi jest częścią większego systemu edycyjnego o nazwie ex. Z poziomu edytora vi można przekazywać polecenia do edytora ex, poprzedzając polecenia znakiem dwukropka (:). W ten sposób uzyskuje się roaszerzenie możliwości edytora vi o takie elementy, jak choćby praca z kilkoma plikami. I tak polecenie r służy do wczytania pliku do bufora tekstowego w miejscu wskazanym przez kursor, czyli wstawienie tekstu z jednego pliku do drugiego. Pełna postać polecenia jest następująca;
r nazwa~liku
Innym przydatnym poleceniem edytora ex jest polecenie f. Pozwala ono na zmianę nazwy pliku wejściowego:
:f nowa_nazwa~liku
Nazwa pliku wejściowego jest z punktu widzenia edytora nazwą pliku, w którym należy zapisać zawartość buforu tekstowego na koniec sesji. Zmieniając nazwę tego pliku można tworzyć różne wersje tego samego tekstu, pod warunkiem, że plik był przedtem modyf kowany.
Pewne cechy edytora vi można zmieniać za pomocą parametrów. Wartości parametrów ustala się poleceniem aet. Użytkownik może m.in. zmieniać wielkość okna, długość wierszy, zasady tabulacji itp. Tutaj zajmiemy się najważniejszym, naszym zdaniem, parametrem, tj. zmianą długości wiersza. Ustawiając odpowiednio wartość tego parametru można spowodować, że edytor będzie samodzielnie wstawiał znaki końca wiersza, co niewątpliwie jest dużym ułatwieniem w pracy. W tym celu należy posłuźyć się parametrem wrapmargin. Na przykład polecenie
set wrapmargin=8
oznacza żądanie automatycznego wstawiania znaku końca wiersza za 72. znakiem (a dokładniej pozostawienia 8-znakowego marginesu w tekście o szerokości 80. znaków), Nie we wszystkich wersjach tegó edytora tak właśnie jest to realizowane. W niektórych wersjach polecenie powyższe powoduje jedynie sygnalizowanie dźwiękowe przekroczenia zdefiniowanego w ten sposób marginesu.
Sesja nr 5 przy terminalu
1. Zarejestruj się w systemie.
2. Wywołaj edytor vi. Nazwa przetwarzanego pliku tekstowego: tekst b
. Zmień długość wiersza na 57 znaków ustawiaj~c odpowiednio parametr wrapmargin (;set wrapmargin=23).
4. Wprowadź następujacy krótki tekst, składajacy się z pięciu wierszy zawierajacych litery małe c i pięciu wierszy z literami małe b, przy czym niech paragraf zawierajacy litery b rozpoczyna się od akapitu.
5. Tekst składa się z dwóch akapitów, załóżmy, że wpisanych w złej kolejności. Należy je więc przestawić wykorzystujac w tym celu operacje na buforach pomocniczych. Wykonaj następujące czynności;
26
Rozdział 2.
skopiuj do bufora k akapit składający się z liter b ("kyG); ustaw kursor na początku pliku;
• wstaw tutaj fragment tekstu przechowywany w buforze k ("kp);
Jak widać na ekranie, tekst zawierający litery b został wstawiony w drugim wierszu, tj. w wierszu następnym w stosunku do aktualnej pozycji kursora - nie o to nam chodziło. W edytorze vi nie można nic wstawić przed pierwszym znakiem w pliku.
• anuluj tę operację poleceniem u;
Edytor wstawia zawartość wskazanego bufora za wierszem, w którym znajduje się aktualnie kursor. Należy o tym pamiętać wykonując operacje na fragmentach tekstu.
• wstaw wiersz pusty w pierwszej linii pliku; ustaw kursor na początku tego wiersza i wykonaj ponownie polecenie "kp;
skasuj akapit wpisywany uprzednio do bufora.
6. Pliki tekst a i tekst b należy połączyć. Wykorzystamy w tym celu polecenie r edytora ex. Zakończ pracę z plikiem tekst b. Wywołaj ponownie edytor vi z plikiem tekst a. Ustaw kursor na końcu pliku tekst a i wprowadź polecenie :r teksf b.
7. Utwórz nowąwersję pliku tekst a wykorzystując w tym celu polecenie :f edytora ex. (:f tekst abc). Uwaga ! Operacja taka skończy się niepowodzeniem, jeśli plik tekst a nie był przedtem modyfikowany.
ó. W pliku tekst b usuń fragment składający się z liter c. 9. Zakończ edycję poleceniem ZZ.
Zakończ sesję przy terminalu.