7795


Rozdział 13.
Podbój powłoki BASH

Rozdział ten opisuje potęgę powłoki BASH zdecydowanie bardziej szczegółowo,[Author ID1: at Sun Nov 11 21:24:00 2001 ] niż to miało miejsce w rozdziale 4. Przedstawione zostaną zmienne, skrypty i aliasy powłoki przygotowując [Author ID2: at Thu Nov 1 21:46:00 2001 ]przygotowujące [Author ID2: at Thu Nov 1 21:46:00 2001 ]do zaawansowanej pracy w systemie Linux.

Powłoka Linuksa

Poznałeś już wcześniej interpretera[Author ID2: at Thu Nov 1 21:47:00 2001 ] komend [Author ID2: at Thu Nov 1 21:47:00 2001 ]poleceń [Author ID2: at Thu Nov 1 21:47:00 2001 ]systemu Linux, czyli tzw. powłokę. Podobnie jak okno wiersza poleceń trybu MS-DOS, powłoka pozwala wydawać komendy[Author ID2: at Thu Nov 1 21:57:00 2001 ]polecenia[Author ID2: at Thu Nov 1 21:57:00 2001 ], które są przez nią interpretowane i wykonywane. Poprzez powłokę właśnie kontrolujesz system Linux [Author ID1: at Sun Nov 11 21:25:00 2001 ]i zarządzasz nim[Author ID1: at Sun Nov 11 21:25:00 2001 ] systemem Linux[Author ID1: at Sun Nov 11 21:25:00 2001 ].

Różnorodność powłok

Powłoka systemu MS-DOS była przez cały czas w miarę niezmienna, na przykład,[Author ID1: at Sun Nov 11 21:25:00 2001 ] między 3[Author ID2: at Thu Nov 1 21:57:00 2001 ].[Author ID1: at Sun Nov 11 21:25:00 2001 ] [Author ID2: at Thu Nov 1 21:57:00 2001 ]wersją MS-DOS v3[Author ID2: at Thu Nov 1 21:57:00 2001 ] a v[Author ID2: at Thu Nov 1 21:57:00 2001 ]wersją [Author ID2: at Thu Nov 1 21:57:00 2001 ]7.[Author ID1: at Sun Nov 11 21:25:00 2001 ] różnic (zmian) było niewiele. Inaczej jest w przypadku powłoki systemu Unix, która przeszła wiele zmian oraz miała trochę inną drogę ewolucji niż konkurentka z MS-DOS. Obecnie możemy znaleźć wiele wersji i odmian powłoki systemu Unix. Odmiany powłoki mają ze sobą dużo wspólnego,[Author ID2: at Thu Nov 1 22:08:00 2001 ] ale każda z nich ma na pewno innego autora i historię powstania oraz sposób w jaki[Author ID2: at Fri Nov 2 12:14:00 2001 ]sposób, w jaki[Author ID2: at Fri Nov 2 12:14:00 2001 ] współpracuje z nią użytkownik.

Linux posiada większość najpopularniejszych powłok systemu Unix; są one przedstawione w tabeli 13.1. Najczęściej używaną z nich wszystkich jest właśnie powłoka [Author ID2: at Thu Nov 1 22:29:00 2001 ]BASH (Bourne Again Shell),[Author ID2: at Thu Nov 1 22:29:00 2001 ] opracowana na podstawie oryginalnej powłoki Unix Bourne. Jest ona w dużym stopniu kompatybilna ze standardem POSIX, który określa składnię i działanie standardowych powłok Uniksa i który został szeroko rozpowszechniony. Ze względu na popularność tego standardu oraz na oczywiste korzyści płynące z pracy z powłokami, które są zgodne z wieloma platformami komputerowymi, rozdział ten skupia się głównie na powłoce BASH. Większość dystrybucji systemu Linux jest tak skonfigurowana,[Author ID2: at Thu Nov 1 22:29:00 2001 ] aby automatycznie uruchamiać tę powłokę zaraz po zalogowaniu. Po więcej informacji na temat innych powłok systemu Linux,[Author ID1: at Sun Nov 11 21:27:00 2001 ] zajrzyj na odpowiednie strony podręcznika systemowego [Author ID2: at Sun Nov 4 18:58:00 2001 ]man.

Tabela 13.1. Powszechnie używane powłoki systemu Linux

Nazwa powłoki

Nazwa programu

Opis

Powłoka ASH

/bin/ash

/bin/bsh

Przypomina powłokę używaną przez System V firmy AT&T.[Author ID2: at Thu Nov 1 22:29:00 2001 ]

Powłoka BASH

/bin/bash

/bin/bash2

Powłoka C

/bin/csh

/bin/tcsh

Druga co od[Author ID2: at Thu Nov 1 22:30:00 2001 ]pod względem[Author ID2: at Thu Nov 1 22:30:00 2001 ] popularności powłoka Uniksa. Zaprojektowana do interaktywnego użytkowania, posiada wiele funkcji i właściwości. Jej składnia przypomina język programowania C.

Powłoka Korna

/bin/ksh

Połączenie powłoki C (część funkcji) i oryginalnej powłoki Bourne'a. Trzecia co do używalności[Author ID2: at Thu Nov 1 22:30:00 2001 ]w rankingu[Author ID2: at Thu Nov 1 22:30:00 2001 ].

Powłoka Z

/bin/zsh

Powłoka oparta na powłoce Korna[Author ID1: at Sun Nov 11 21:28:00 2001 ], posiada wiele wbudowanych właściwości.

Po co[Author ID2: at Thu Nov 1 22:30:00 2001 ]Dlaczego warto[Author ID2: at Thu Nov 1 22:30:00 2001 ] uczyć się poleceń [Author ID2: at Thu Nov 1 22:30:00 2001 ]powłoki?

Jeśli jesteś przyzwyczajony do używania graficznego interfejsu użytkownika, możesz zadawać sobie pytanie, czy warto jest się uczyć powłoki Linuksa. Wielu bowiem początkujących użytkowników tego systemu twierdzi, że praca z powłoką jest kłopotliwa, część z nich instaluje graficzny interfejs użytkownika i unika powłoki jak ognia.

Prawdą jest, że interfejs tekstowy jest starszą formą interakcji użytkownika z komputerem,[Author ID2: at Thu Nov 1 22:31:00 2001 ] ale tak się składa, że na[Author ID2: at Wed Nov 7 11:27:00 2001 ] dzień dz[Author ID2: at Wed Nov 7 11:27:00 2001 ]isiejszy[Author ID2: at Wed Nov 7 11:27:00 2001 ]obecnie[Author ID2: at Wed Nov 7 11:27:00 2001 ] interfejs graficzny jest bardziej prymitywny niż znakowy. A to dlatego[Author ID2: at Fri Nov 2 12:15:00 2001 ]to[Author ID2: at Fri Nov 2 12:15:00 2001 ],[Author ID2: at Fri Nov 2 12:15:00 2001 ][Author ID1: at Sun Nov 11 21:28:00 2001 ] dlatego[Author ID2: at Fri Nov 2 12:15:00 2001 ], że nie został jeszcze w pełni rozwinięty. Jest on co prawda łatwiejszy w użyciu, częściej stosowany,[Author ID2: at Thu Nov 1 22:39:00 2001 ] ale nie jest tak wyrafinowany i wydajny jak powłoka. Używanie graficznego interfejsu użytkownika przypomina czasami język migowy I[Author ID2: at Thu Nov 1 22:39:00 2001 ]I[Author ID2: at Fri Nov 2 12:15:00 2001 ]ndian Amerykańskich[Author ID2: at Thu Nov 1 22:39:00 2001 ]amerykańskich[Author ID2: at Thu Nov 1 22:39:00 2001 ]. Jeśli wiadomość, którą chcesz komuś przekazać, jest krótka i prosta,[Author ID2: at Thu Nov 1 22:40:00 2001 ] jak np.:[Author ID2: at Thu Nov 1 22:40:00 2001 ] „przybywam w pokoju”, możesz ją wypowiedzieć przy użyciu kilku gestów. Natomiast jeśli chciałbyś komuś wytłumaczyć różnice pomiędzy interfejsem graficznym a znakowym, mógłbyś mieć wiele problemów.

Każdy narodowy język migowy, używany głównie przez ludzi niesłyszących, jest bogatszy niż indiański język migowy. Niestety programiści jeszcze nie potrafią stworzyć interfejsu graficznego o tak złożonej strukturze. Projektant takiego interfejsu musi przewidywać wszystkie sposoby,[Author ID2: at Thu Nov 1 22:40:00 2001 ] jakimi użytkownik będzie komunikował się z systemem, i dostarczyć odpowiednich metod (tylko przy [Author ID2: at Fri Nov 2 12:48:00 2001 ]za [Author ID2: at Fri Nov 2 12:48:00 2001 ]pom[Author ID2: at Fri Nov 2 12:48:00 2001 ]ocy [Author ID2: at Fri Nov 2 12:48:00 2001 ]pomocą [Author ID2: at Fri Nov 2 12:48:00 2001 ]wskazywania i klikania myszką!),[Author ID2: at Thu Nov 1 22:40:00 2001 ] aby program mógł prawidłowo reagować na żądania użytkownika. W związku z tym użytkownik jest właściwie zmuszany do wykonywania ściśle określonych operacji i dlatego nie może zaad[Author ID2: at Thu Nov 1 23:45:00 2001 ]aptować [Author ID2: at Thu Nov 1 23:45:00 2001 ] --> on takiego [Author ID2: at Thu Nov 1 23:45:00 2001 ]programu interfejsu [Author:RiAG] graficznego zaadoptować [Author ID2: at Thu Nov 1 23:45:00 2001 ]do wykonywania nieprzewidzianych zadań i odpowiadania na nieokreślone okoliczności. Ze względu na dużą odpowiedzialność za utrzymanie systemu i bezpieczeństwo danych, gdzie wciąż trzeba zmagać się z nieprzewidywalnymi zdarzeniami i problemami, większość administratorów wykonuje swoje zadania przy użyciu powłoki, a nie interfejsu graficznego.

Powłoka jest odzwierciedleniem filozofii systemu Unix, który dostarcza wielu małych i prostych narzędzi (programów), z których każde wykonujące jedno zadanie. Kiedy zachodzi potrzeba wykonania złożonej operacji, narzędzia współpracują ze sobą, wykonując działania jedno po drugim. Wiele narzędzi systemu Unix manipuluje tekstem,[Author ID2: at Fri Nov 2 08:36:00 2001 ] a od czasu kiedy[Author ID2: at Fri Nov 2 12:16:00 2001 ]czasu, kiedy[Author ID2: at Fri Nov 2 12:16:00 2001 ] Unix przechowuje dane w formie tekstu,[Author ID2: at Fri Nov 2 08:37:00 2001 ] a nie w formie binarnej, narzędzia te idealnie zaczęły się nadawać do sterowania pracą samego systemu. Taką właściwość daje powłoka — łączenie narzędzi do wspólnego wykonywania zadań systemowych, co stanowi o sile i wydajności wszystkich systemów U[Author ID2: at Fri Nov 2 08:37:00 2001 ]u[Author ID2: at Fri Nov 2 08:37:00 2001 ]niksowych. Dodatkowo powłoka --> jest rozszerzalna:[Author ID2: at Sun Nov 4 18:59:00 2001 ] [Author ID2: at Sun Nov 4 18:59:00 2001 ][Author:JAZ] [Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ] Możesz [Author ID2: at Sun Nov 4 18:59:00 2001 ]możesz [Author ID2: at Sun Nov 4 18:59:00 2001 ]tworzyć skrypty powłoki, które pozwalają przechowywać szereg poleceń do późniejszego wykonania, oszczędza to czas, który zmarnowałbyś wpisując te polecenia za każdym razem, gdy zamierzasz wykonać konkretne zadanie.

Odwrotną filozofię można zaobserwować w systemie Microsoft Windows, który obsługuje monolityczne programy, zawierające menu, podmenu i okna dialogowe. Takie programy nie mają jak ze sobą współpracować, więc raczej niemożliwe jest wykonywanie złożonych zadań. Są łatwe w użyciu,[Author ID2: at Fri Nov 2 08:37:00 2001 ] ale tylko wtedy,[Author ID2: at Fri Nov 2 08:37:00 2001 ] gdy musisz wykonać jedno zadanie,[Author ID2: at Fri Nov 2 08:37:00 2001 ] do którego zostały zaprojektowane, natomiast kiedy spróbujesz wykonać operację inną drogą niż zaprogramowana, napotkasz same trudności.

Oczywiście nie wszyscy zgadzają się z tą opinią. Grupy dyskusyjne są przepełnione wiadomościami mówiącymi o zaletach środowiska graficznego. Niektórzy z użytkowników takich grup postrzegają systemy Unix jako zabytkowe zabawki. Nawet jeśli mają rację, to jedynie ucząc się poleceń i funkcji powłoki,[Author ID2: at Wed Nov 7 11:45:00 2001 ] przekonasz się sam,[Author ID2: at Wed Nov 7 11:45:00 2001 ] do czego tak naprawdę przydatny jest obecnie taki system.

Zdanie autora jest jednoznaczne:[Author ID2: at Sun Nov 4 19:00:00 2001 ][Author ID2: at Sun Nov 4 19:00:00 2001 ] Kiedy [Author ID2: at Sun Nov 4 19:00:00 2001 ]kiedy [Author ID2: at Sun Nov 4 19:00:00 2001 ]wykonujesz proste, pojedyncze zadanie, możesz używać interfejsu graficznego, który umili Ci [Author ID2: at Sun Nov 4 19:00:00 2001 ]ci [Author ID2: at Sun Nov 4 19:00:00 2001 ]pracę,[Author ID2: at Fri Nov 2 08:38:00 2001 ] ale podczas wykonywania skomplikowanego zadania administracyjnego, wymagającego od użytkownika wyobraźni i myślenia, stanowczo zalecam używania [Author ID2: at Fri Nov 2 08:38:00 2001 ]używanie [Author ID2: at Fri Nov 2 08:38:00 2001 ]powłoki (przekonaj się sam!). Rozwiązania stworzone przy [Author ID2: at Fri Nov 2 08:38:00 2001 ]za [Author ID2: at Fri Nov 2 08:38:00 2001 ]pomocy [Author ID2: at Fri Nov 2 08:38:00 2001 ]pomocą [Author ID2: at Fri Nov 2 08:38:00 2001 ]funkcji i poleceń powłoki mogą być zapisane do pliku i wykorzystane ponownie w przyszłości, niekoniecznie do wykonania tego samego zadania. Co ważniejsze,[Author ID2: at Fri Nov 2 08:39:00 2001 ] podczas rozwiązywania powiązanych problemów, [Author ID2: at Fri Nov 2 08:39:00 2001 ]skrypty powłoki mogą zostać użyte do przypomnienia dawno zapomnianych szczegółów, podczas rozwiązywania powiązanych problemów[Author ID2: at Fri Nov 2 08:39:00 2001 ].[Author ID2: at Fri Nov 2 12:17:00 2001 ]

[Author ID2: at Fri Nov 2 12:17:00 2001 ]

Używanie powłoki

Powłoka systemu Linux została już przedstawiona w rozdziale 4. Jednakże wiele bardzo ważnych szczegółów zostało w nim pominiętych ze względu na jego [Author ID2: at Wed Nov 7 11:46:00 2001 ]jej [Author ID2: at Wed Nov 7 11:46:00 2001 ]funkcje; miał on[Author ID2: at Wed Nov 7 11:46:00 2001 ]rozdział[Author ID2: at Wed Nov 7 11:46:00 2001 ] umożliwić[Author ID2: at Wed Nov 7 11:46:00 2001 ][Author ID2: at Wed Nov 7 11:46:00 2001 ] Tobie [Author ID2: at Fri Nov 2 08:39:00 2001 ]szybkie uruchomienie systemu i zapoznanie z podstawowymi operacjami. Poniższa [Author ID2: at Fri Nov 2 08:39:00 2001 ]R[Author ID2: at Wed Nov 7 11:46:00 2001 ]sekcja [Author ID2: at Fri Nov 2 08:39:00 2001 ]r[Author ID2: at Wed Nov 7 11:46:00 2001 ]ozszerza[Author ID2: at Wed Nov 7 11:47:00 2001 ]ymy jednak[Author ID2: at Wed Nov 7 11:47:00 2001 ] zagadnienia dotyczące [Author ID2: at Wed Nov 7 11:47:00 2001 ]powłoki i [Author ID2: at Fri Nov 2 08:39:00 2001 ]dają [Author ID2: at Fri Nov 2 08:39:00 2001 ]opiszemy je w [Author ID2: at Wed Nov 7 11:47:00 2001 ]szczegółowy opis [Author ID2: at Wed Nov 7 11:47:00 2001 ]sposobów[Author ID2: at Wed Nov 7 11:47:00 2001 ]ób[Author ID2: at Wed Nov 7 11:47:00 2001 ] jej wydajnego używania[Author ID2: at Wed Nov 7 11:47:00 2001 ].

Wprowadzanie komend[Author ID2: at Fri Nov 2 08:39:00 2001 ]poleceń[Author ID2: at Fri Nov 2 08:39:00 2001 ]

Wpisując nazwy programów lub skry[Author ID2: at Fri Nov 2 08:40:00 2001 ]ptów [Author ID2: at Fri Nov 2 08:40:00 2001 ]w wierszu poleceń komendy[Author ID2: at Fri Nov 2 08:40:00 2001 ], masz wtedy[Author ID2: at Fri Nov 2 08:40:00 2001 ] dostęp do mini [Author ID2: at Fri Nov 2 08:40:00 2001 ]edytora, który przypomina program DOSKEY znany z systemu MS-DOS. Tabela 13.2 podsumowuje niektóre użyteczne skróty klawiszowe interpretowane przez powłokę jako komendy[Author ID2: at Fri Nov 2 08:40:00 2001 ]polecenia[Author ID2: at Fri Nov 2 08:40:00 2001 ]. Skróty te umożliwiają dostęp do ostatnio wydawanych poleceń zapisanych w historii. Aby ponownie wydać polecenie,[Author ID2: at Fri Nov 2 08:41:00 2001 ] możesz kilkakrotnie wcisnąć [Author ID2: at Fri Nov 2 08:41:00 2001 ]nacisnąć [Author ID2: at Fri Nov 2 08:41:00 2001 ]klawisz kursora w górę i po znalezieniu żądanej komendy[Author ID2: at Fri Nov 2 08:41:00 2001 ]go[Author ID2: at Fri Nov 2 08:41:00 2001 ] wcisnąć [Author ID2: at Fri Nov 2 08:41:00 2001 ]nacisnąć [Author ID2: at Fri Nov 2 08:41:00 2001 ]Enter.

Tabela 13.2. Użyteczne skróty klawiatury

Klawisz

Funkcja

Up

Down

Left

Przesuwa kursor o jeden znak do tyłu.

Right

Przesuwa kursor o jeden znak do przodu.

Esc f

Przesuwa kursor o jedno słowo do przodu.

Esc b

Przesuwa kursor o jedno słowo do tyłu.

Ctrl+A

Ctrl+E

Ctrl+D

Backspace

Kasuje pierwszy znak przed kursorem.

Esc d

Kasuje cały wyraz.

Ctrl+U

Esc k

Ctrl+Y

Odzyskuje ostatnio usunięty element (znak, wyraz).

Esc .

Wstawia ostatni wyraz poprzedniej komendy[Author ID2: at Fri Nov 2 08:44:00 2001 ]go polecenia[Author ID2: at Fri Nov 2 08:44:00 2001 ].

Ctrl+L

Tab

--> Przystępuje do wypełnienia [Author ID2: at Wed Nov 7 11:50:00 2001 ]Dopełnia [Author ID2: at Wed Nov 7 11:50:00 2001 ](dokończenia) [Author ID2: at Wed Nov 7 11:50:00 2001 ]słowa,[Author ID2: at Wed Nov 7 11:50:00 2001 ] lub[Author ID2: at Wed Nov 7 11:50:00 2001 ] wyrazu [Author ID2: at Wed Nov 7 11:50:00 2001 ]wyrazy[Author ID2: at Wed Nov 7 11:50:00 2001 ][Author:JAZ] [Author ID2: at Wed Nov 7 11:51:00 2001 ], [Author ID2: at Wed Nov 7 11:50:00 2001 ]interpretując go [Author ID2: at Wed Nov 7 11:50:00 2001 ]je [Author ID2: at Wed Nov 7 11:50:00 2001 ]jako nazwę pliku, nazwę użytkownika, nazwę zmiennej, nazwę hosta,[Author ID2: at Fri Nov 2 08:44:00 2001 ] lub ko[Author ID2: at Fri Nov 2 08:44:00 2001 ]mendy [Author ID2: at Fri Nov 2 08:44:00 2001 ]polecenia [Author ID2: at Fri Nov 2 08:44:00 2001 ]zależnie od kontekstu.

Esc ?

Wyświetla listę możliwych dopełnień.

Jednym z bardziej użytecznych poleceń klawiatury jest Tab, który również może być stosowany do wydawania komend[Author ID2: at Fri Nov 2 08:44:00 2001 ]poleceń[Author ID2: at Fri Nov 2 08:44:00 2001 ]. Jeśli na przykład wpiszesz pewną część nazwy pliku i wciśniesz klawisz Tab, powłoka postara się zlokalizować plik, którego nazwa pokrywa się z wprowadzonymi znakami. Jeśli dokładnie jeden plik zostanie znaleziony i w dodatku dokładnie jego się spodziewałeś, powłoka wypełni [Author ID2: at Fri Nov 2 08:45:00 2001 ]dopełni [Author ID2: at Fri Nov 2 08:45:00 2001 ]nazwę,[Author ID2: at Fri Nov 2 08:45:00 2001 ] a Ty [Author ID2: at Fri Nov 2 08:45:00 2001 ]ty [Author ID2: at Fri Nov 2 08:45:00 2001 ]wciśnij [Author ID2: at Fri Nov 2 08:45:00 2001 ]naciśnij [Author ID2: at Fri Nov 2 08:45:00 2001 ]Enter,[Author ID2: at Fri Nov 2 08:45:00 2001 ] aby wykonać komendę [Author ID2: at Fri Nov 2 08:45:00 2001 ]polecenie[Author ID2: at Fri Nov 2 08:45:00 2001 ]lub wpisuj dalej polecenie[Author ID2: at Fri Nov 2 08:45:00 2001 ]. Ta właściwość zwana jest wypełnieniem [Author ID2: at Wed Nov 7 11:50:00 2001 ]dopełnieniem [Author ID2: at Wed Nov 7 11:50:00 2001 ]nazw plików lub dopełnieniem komend [Author ID2: at Fri Nov 2 08:46:00 2001 ]poleceń [Author ID2: at Fri Nov 2 08:46:00 2001 ]i znacznie ułatwia używanie powłoki.

W dodatku do[Author ID2: at Wed Nov 7 11:51:00 2001 ]Oprócz[Author ID2: at Wed Nov 7 11:51:00 2001 ] powyższych skrótów klawiaturowych,[Author ID2: at Wed Nov 7 11:51:00 2001 ] powłoka interpretuje jeszcze kilka innych sekwencji klawiszy, które kontrolują operacje wykonywanych aktualnie programów. Tabela 13.3 opisuje te[Author ID2: at Fri Nov 2 12:18:00 2001 ] sekwencje. Na przykład jednoczesne wciśnięcie klawiszy Ctrl+C powoduje przerwanie działania programu i jego zakończenie. Polecenie to jest pomocne,[Author ID2: at Fri Nov 2 08:46:00 2001 ] gdy samo wykonywanie programu zajmuje dużo czasu,[Author ID2: at Fri Nov 2 08:46:00 2001 ] a istnieją inne sposoby na jego szybsze wykonanie.

Tabela 13.3. Klawisze Kontrolne[Author ID2: at Fri Nov 2 08:47:00 2001 ]kontrolne[Author ID2: at Fri Nov 2 08:47:00 2001 ]

Sekwencja klawiszy

Funkcja

Ctrl+C

Wysyła do aktualnie wykonywanej komendy[Author ID2: at Fri Nov 2 08:46:00 2001 ]go[Author ID2: at Fri Nov 2 08:46:00 2001 ] polecenia[Author ID2: at Fri Nov 2 08:46:00 2001 ] sygnał przerwania, co generalnie powoduje zakończenie działania programu.

Ctrl+D

Wysyła do aktualnie wykonywanej komendy[Author ID2: at Fri Nov 2 08:47:00 2001 ]go polecenia[Author ID2: at Fri Nov 2 08:47:00 2001 ] sygnał końca pliku. Blokuje wejście konsoli.

Ctrl+Z

Zatrzymuje wykonywanie aktualnie aktywnego zadania.

Istnieje kilka innych specjalnych klawiszy kontrolujących działanie powłoki (patrz tabelk[Author ID2: at Fri Nov 2 08:47:00 2001 ]a 13.4). Znaki[Author ID2: at Fri Nov 2 12:18:00 2001 ] # i ; są często używanymi znakami w skryptach powłoki, o których przeczytasz dalej [Author ID2: at Fri Nov 2 08:47:00 2001 ]jeszcze [Author ID2: at Fri Nov 2 08:47:00 2001 ]w tym rozdziale. Znak & jest głównie używany do uruchamiania poleceń w tle.

Tabela 13.4. Inne specjalne znaki powłoki

Znak

Funkcja

#

Zaznacza komendę [Author ID2: at Fri Nov 2 08:47:00 2001 ]polecenie [Author ID2: at Fri Nov 2 08:47:00 2001 ]jako komentarz, przez co interpreter powłoki ją ignoruje.[Author ID2: at Sun Nov 4 19:00:00 2001 ]

;

&

Znak [Author ID2: at Wed Nov 7 11:52:00 2001 ]U[Author ID2: at Wed Nov 7 11:52:00 2001 ]u[Author ID2: at Wed Nov 7 11:52:00 2001 ]mieszczony na końcu polecenia powoduje uruchomienie go w tle, tak że po wciśnięciu [Author ID2: at Fri Nov 2 08:48:00 2001 ]naciśnięciu [Author ID2: at Fri Nov 2 08:48:00 2001 ]klawisza Enter pojawia się natychmiast znak zachęty powłoki.

Komendy [Author ID2: at Fri Nov 2 12:48:00 2001 ]Polecenia [Author ID2: at Fri Nov 2 12:48:00 2001 ]i argumenty

Jak już zapewne wiesz,[Author ID2: at Fri Nov 2 08:48:00 2001 ] generalna składnia komendy [Author ID2: at Fri Nov 2 08:48:00 2001 ]polecenia [Author ID2: at Fri Nov 2 08:48:00 2001 ]powłoki wygląda tak[Author ID2: at Fri Nov 2 08:48:00 2001 ]następująco[Author ID2: at Fri Nov 2 08:48:00 2001 ]:

command option arguments[Author ID2: at Fri Nov 2 12:19:00 2001 ] (komenda, opcje, argumenty)[Author ID2: at Fri Nov 2 12:19:00 2001 ]polecenie opcje argumenty[Author ID2: at Fri Nov 2 12:19:00 2001 ]

W powyższym przykładzie command[Author ID0: at Thu Nov 30 00:00:00 1899 ]polecenie[Author ID2: at Fri Nov 2 12:19:00 2001 ] określa jaką[Author ID2: at Fri Nov 2 08:50:00 2001 ] operację, którą[Author ID2: at Fri Nov 2 08:50:00 2001 ] ma wykonać powłoka;[Author ID2: at Fri Nov 2 08:50:00 2001 ] a[Author ID2: at Fri Nov 2 08:50:00 2001 ] options i arguments[Author ID0: at Thu Nov 30 00:00:00 1899 ]opcje[Author ID2: at Fri Nov 2 12:19:00 2001 ] i [Author ID2: at Fri Nov 2 12:19:00 2001 ]argumenty[Author ID2: at Fri Nov 2 12:19:00 2001 ] wpływają na przebieg działania i zakres operacji. Czasami command [Author ID0: at Thu Nov 30 00:00:00 1899 ]polecenie[Author ID2: at Fri Nov 2 12:19:00 2001 ] [Author ID2: at Fri Nov 2 12:19:00 2001 ]oznacza plik programu do uruchomienia --> i wykonania[Author ID3: at Tue Nov 13 11:58:00 2001 ][Author:JAZ] [Author ID2: at Wed Nov 7 11:52:00 2001 ][Author ID3: at Tue Nov 13 11:58:00 2001 ].[Author ID3: at Tue Nov 13 11:58:00 2001 ] — wtedy[Author ID2: at Fri Nov 2 08:51:00 2001 ] [Author ID2: at Fri Nov 2 12:20:00 2001 ], taka komenda[Author ID2: at Fri Nov 2 08:51:00 2001 ]polecenie[Author ID2: at Fri Nov 2 08:51:00 2001 ] nazywana [Author ID2: at Fri Nov 2 08:51:00 2001 ]nazywane [Author ID2: at Fri Nov 2 08:51:00 2001 ]jest komendą [Author ID2: at Fri Nov 2 08:51:00 2001 ]poleceniem [Author ID2: at Fri Nov 2 08:51:00 2001 ]zewnętrzną[Author ID2: at Fri Nov 2 08:51:00 2001 ]zewnętrznym[Author ID2: at Fri Nov 2 08:51:00 2001 ]. Linux generalnie [Author ID2: at Fri Nov 2 08:52:00 2001 ]przechowuje te pliki w katalogach /bin, /usr/bin lub /usr/local/bin. Komendy [Author ID2: at Fri Nov 2 08:52:00 2001 ]Polecenia [Author ID2: at Fri Nov 2 08:52:00 2001 ]administracyjne są zazwyczaj przechowywane w katalogu /sbin lub /usr/sbin. --> Kiedy komenda [Author ID2: at Fri Nov 2 08:52:00 2001 ]polecenie [Author ID2: at Fri Nov 2 08:52:00 2001 ]określa plik programu, powłoka przekazuje wszystkie podane argumenty i opcje do programu, który sprawdza je i interpretuje,[Author ID2: at Fri Nov 2 08:52:00 2001 ] a [Author ID2: at Fri Nov 2 08:52:00 2001 ]następnie wprowadza wraz z poleceniem.[Author:JAZ] [Author ID2: at Wed Nov 7 11:53:00 2001 ]

Jednakże niektóre komendy [Author ID2: at Fri Nov 2 08:52:00 2001 ]polecenia [Author ID2: at Fri Nov 2 08:52:00 2001 ]nie są plikami programów, są za to wbudowane w strukturę powłoki i przez nią tylko interpretowane. Sposób,[Author ID2: at Fri Nov 2 08:53:00 2001 ] w jaki powłoki obsługują wbudowane komendy [Author ID2: at Fri Nov 2 08:53:00 2001 ]polecenia[Author ID2: at Fri Nov 2 08:53:00 2001 ], [Author ID2: at Fri Nov 2 08:53:00 2001 ]jest jedną z cech, które różnią powłoki od siebie. Trochę dalej[Author ID2: at Fri Nov 2 08:54:00 2001 ]Jeszcze[Author ID2: at Fri Nov 2 08:54:00 2001 ] w tym rozdziale znajdziesz kilka komend [Author ID2: at Fri Nov 2 08:54:00 2001 ]poleceń [Author ID2: at Fri Nov 2 08:54:00 2001 ]wbudowanych w powłokę BASH.

Uogólnianie nazewnictwa plików (Filename globbing)

Zanim powłoka przekaże argumenty i opcje do zewnętrznego programu lub zinterpretuje wbudowaną [Author ID2: at Fri Nov 2 08:54:00 2001 ]wbudowane [Author ID2: at Fri Nov 2 08:54:00 2001 ]komendę[Author ID2: at Fri Nov 2 08:54:00 2001 ]polecenie[Author ID2: at Fri Nov 2 08:54:00 2001 ], sprawdza linię [Author ID2: at Fri Nov 2 08:54:00 2001 ]wiersz [Author ID2: at Fri Nov 2 08:54:00 2001 ]poleceń,[Author ID2: at Wed Nov 7 11:54:00 2001 ] poszukując znaków specjalnych i wykonuje operację zwaną uogólnianiem nazewnictwa plików (filename globbing). Jest to operacja przypominająca przetwarzanie --> wieloznaczników[Author ID2: at Fri Nov 2 12:20:00 2001 ][Author:JAZ] s[Author ID2: at Fri Nov 2 12:20:00 2001 ]ymboli wieloznacznych[Author ID2: at Fri Nov 2 12:20:00 2001 ][Author ID2: at Fri Nov 2 08:55:00 2001 ] (wildcards) w systemie MS-DOS, ale o wiele bardziej złożona. Tabela 13.5 opisuje znaki specjalne używane przy rozwijaniu nazewnictwa plików, zwane także meta [Author ID2: at Sun Nov 4 19:01:00 2001 ]znakami plikowymi.

Meta znak

Znaczenie

*

Dopasowuje łańcuch dowolnych znaków (nawet brak znaku jest dopuszczalny).[Author ID2: at Fri Nov 2 08:55:00 2001 ]

?

Dopasowuje dokładnie jeden znak.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

[abc ...]

Dopasowuje każdy podany znak.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

[a-z]

Dopasowuje każdy znak z podanego zakresu.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

[!abc ...]

Dopasowuje każdy znak inny niż podane.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

[!a-z]

Dopasowuje każdy znak nie podany w zakresie.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

~

Oznacza katalog macierzysty aktualnego użytkownika.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

~userid

Określa katalog macierzysty podanego użytkownika.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

~+

~-

Poprzedni katalog roboczy.[Author ID2: at Fri Nov 2 08:55:00 2001 ]

W operacji uogólniania nazewnictwa plików (zwanej też rozwijaniem nazewnictwa), podobnie jak przy przetwarzaniu symboli [Author ID2: at Fri Nov 2 12:21:00 2001 ]wieloznaczników [Author ID2: at Fri Nov 2 12:21:00 2001 ]wieloznacznych [Author ID2: at Fri Nov 2 12:21:00 2001 ](wildcards) w systemie MS-DOS, powłoka przystępuje do zamiany meta [Author ID2: at Fri Nov 2 12:21:00 2001 ]znaków pojawiających się jako argumenty polecenia w taki sposób, że argumenty te określają teraz nazwy plików. Rozwijanie nazewnictwa plików ułatwia określanie nazw plików oraz grup plików.

Na przykład,[Author ID2: at Fri Nov 2 08:59:00 2001 ] załóżmy,[Author ID2: at Fri Nov 2 08:59:00 2001 ] że aktualny katalog roboczy zawiera cztery pliki o nazwach: plik1, plik2, plik3 i plik04. Chcemy poznać rozmiar każdego z nich. Pomoże nam w tym następująca komenda[Author ID2: at Fri Nov 2 08:59:00 2001 ]e polecenie[Author ID2: at Fri Nov 2 08:59:00 2001 ]:

ls -l plik1 plik2 plik3 plik04

Jednakże poniższa komenda[Author ID2: at Fri Nov 2 09:00:00 2001 ]e polecenie[Author ID2: at Fri Nov 2 09:00:00 2001 ] wyświetli nam te same informacje, a w dodatku jest krótsza[Author ID2: at Fri Nov 2 09:00:00 2001 ]krótsze[Author ID2: at Fri Nov 2 09:00:00 2001 ]:

ls -l plik*

Jak pokazuje tabela 13.5,[Author ID2: at Fri Nov 2 09:00:00 2001 ] meta [Author ID2: at Fri Nov 2 09:00:00 2001 ]znak * odpowiada wszystkim znakom i łańcuchom znaków. Kolejny przykład:

ls -l plik?

Meta [Author ID2: at Fri Nov 2 09:00:00 2001 ]znak ? odpowiada tylko pojedynczemu znakowi (a nie łańcuchowi znaków). Wobec tego nie zobaczysz informacji na temat plik04.

Podobnie polecenie:

ls -l plik[2-3]

wyświetli tylko informacje o plikach [Author ID2: at Fri Nov 2 09:00:00 2001 ]: plik2 i plik3, ponieważ tylko ich nazwy mieszczą się w zakresie określonych znaków [2-3].

Następną ważną cechą jest możliwość podania kilku meta [Author ID2: at Fri Nov 2 09:00:00 2001 ]znaków dla jednego argumentu. Rozważmy taki przykład:

ls -l plik??

Polecenie to wyświetli informacje dotyczące plik04, ponieważ każdy meta [Author ID2: at Fri Nov 2 09:00:00 2001 ]znak odpowiada dokładnie jednemu brakującemu znakowi występującemu w nazwie pliku.

Większość komend [Author ID2: at Fri Nov 2 09:01:00 2001 ]poleceń [Author ID2: at Fri Nov 2 09:01:00 2001 ]pozwala podać kilka argumentów. Jeśli żaden plik nie pasuje do podanego argumentu, komenda [Author ID2: at Fri Nov 2 09:01:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:01:00 2001 ]ignoruje taki argument. Oto kolejne polecenie wyświetlające wszystkie cztery pliki:

ls -l file0* file[1-3]

Uwaga

Przypuśćmy, że komenda [Author ID2: at Fri Nov 2 09:01:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:01:00 2001 ]posiada kilka argumentów, z których każdy zawiera kilka meta [Author ID2: at Fri Nov 2 09:01:00 2001 ]znaków. Jeśli żaden z argumentów nie będzie pasował do żadnego pliku, powłoka przekaże argumenty z niezmienionymi meta [Author ID2: at Fri Nov 2 09:04:00 2001 ]znakami do programu. Program spodziewający się ważnej nazwy [Author ID2: at Wed Nov 7 11:55:00 2001 ]pliku zwróci komunikat o niespodziewanym błędzie.

Inny meta [Author ID2: at Fri Nov 2 09:04:00 2001 ]znak pozwala w prosty sposób odwołać się do katalogu macierzystego. Na przykład,[Author ID2: at Fri Nov 2 09:04:00 2001 ] wydając następującą [Author ID2: at Fri Nov 2 09:04:00 2001 ]następujące [Author ID2: at Fri Nov 2 09:04:00 2001 ]komendę[Author ID2: at Fri Nov 2 09:05:00 2001 ]polecenie[Author ID2: at Fri Nov 2 09:05:00 2001 ]:

ls ~

spowodujesz wyświetlenie zawartości plików we własnym katalogu macierzystym.

Meta [Author ID2: at Fri Nov 2 09:05:00 2001 ]znaki nie istnieją po to,[Author ID2: at Fri Nov 2 09:05:00 2001 ] by zaoszczędzić czasu na wpisywaniu nazw plików. Pozwalają natomiast pisać skrypty, które selektywnie przetwarzają pliki poprzez ich nazwy. Dalej [Author ID2: at Fri Nov 2 09:05:00 2001 ]Jeszcze [Author ID2: at Fri Nov 2 09:05:00 2001 ]w tym rozdziale zobaczysz,[Author ID2: at Fri Nov 2 09:05:00 2001 ] jak to działa.

Aliasy

Aliasy powłoki ułatwiają używanie komend [Author ID2: at Fri Nov 2 09:05:00 2001 ]poleceń [Author ID2: at Fri Nov 2 09:05:00 2001 ]poprzez umożliwianie tworzenia skróconych nazw dla komend [Author ID2: at Fri Nov 2 09:06:00 2001 ]poleceń [Author ID2: at Fri Nov 2 09:06:00 2001 ]wraz z ich argumentami. Aby utworzyć alias dla dowolnej komendy[Author ID2: at Fri Nov 2 09:06:00 2001 ]go polecenia,[Author ID2: at Fri Nov 2 09:06:00 2001 ] skorzystaj z poniżej podanej [Author ID2: at Fri Nov 2 09:06:00 2001 ]podanego [Author ID2: at Fri Nov 2 09:06:00 2001 ]formy[Author ID2: at Fri Nov 2 09:06:00 2001 ]przykładu[Author ID2: at Fri Nov 2 09:06:00 2001 ]:

alias name[Author ID2: at Wed Nov 7 11:56:00 2001 ]nazwa[Author ID2: at Wed Nov 7 11:56:00 2001 ]='[Author ID2: at Wed Nov 7 11:55:00 2001 ]command[Author ID2: at Wed Nov 7 11:55:00 2001 ]'[Author ID2: at Wed Nov 7 11:55:00 2001 ]'[Author ID2: at Wed Nov 7 11:55:00 2001 ]polecenie[Author ID2: at Wed Nov 7 11:55:00 2001 ]'[Author ID2: at Wed Nov 7 11:55:00 2001 ]

gdzie command[Author ID2: at Wed Nov 7 11:56:00 2001 ] [Author ID2: at Wed Nov 7 11:56:00 2001 ]polecenie[Author ID2: at Wed Nov 7 11:56:00 2001 ] [Author ID2: at Wed Nov 7 11:56:00 2001 ]oznacza komendę[Author ID2: at Fri Nov 2 12:22:00 2001 ]polecenie[Author ID2: at Fri Nov 2 12:22:00 2001 ],[Author ID2: at Fri Nov 2 09:06:00 2001 ] dla którego chcesz utworzyć alias,[Author ID2: at Fri Nov 2 09:06:00 2001 ] a name[Author ID2: at Wed Nov 7 11:56:00 2001 ] [Author ID2: at Wed Nov 7 11:56:00 2001 ]nazwa[Author ID2: at Wed Nov 7 11:56:00 2001 ] [Author ID2: at Wed Nov 7 11:56:00 2001 ]określa nazwę aliasa[Author ID2: at Fri Nov 2 12:22:00 2001 ]aliasu[Author ID2: at Fri Nov 2 12:22:00 2001 ]. Przypuśćmy, że zamiast Linuksowej [Author ID2: at Fri Nov 2 09:07:00 2001 ]linuksowego [Author ID2: at Fri Nov 2 09:07:00 2001 ]komendy [Author ID2: at Fri Nov 2 09:07:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:07:00 2001 ]ls wpisujesz wciąż z przyzwyczajenia polecenie dir znane z systemu MS-DOS. Możesz utworzyć alias dla komendy [Author ID2: at Fri Nov 2 09:07:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:07:00 2001 ]ls o nazwie dir w następujący sposób:

alias dir='ls -l'

Teraz gdy masz już założony[Author ID2: at Wed Nov 7 11:56:00 2001 ]utworzyłeś już[Author ID2: at Wed Nov 7 11:56:00 2001 ] alias dla komendy [Author ID2: at Fri Nov 2 09:07:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:07:00 2001 ]ls -l, nawet jak [Author ID2: at Wed Nov 7 11:56:00 2001 ]gdy [Author ID2: at Wed Nov 7 11:56:00 2001 ]się pomylisz i wpiszesz polecenie dir, to i tak zostanie wyświetlona zawartość aktualnego katalogu roboczego, a nie komunikat:[Author ID2: at Fri Nov 2 09:07:00 2001 ] command not found (nie znaleziono polecenia). Jeśli chcesz dla innych poleceń r[Author ID2: at Fri Nov 2 09:08:00 2001 ]R[Author ID2: at Fri Nov 2 09:08:00 2001 ]ównież dla innych poleceń [Author ID2: at Fri Nov 2 09:08:00 2001 ]możesz tworzyć aliasy.

Domyślna konfiguracja systemu Linux posiada zapewne kilka już zdefiniowanych aliasów. Aby je zobaczyć,[Author ID2: at Fri Nov 2 09:08:00 2001 ] wydaj polecenie:

alias

Jeśli jesteś zalogowany na koncie użytkownika root, zobaczysz prawdopodobnie coś takiego:

alias cp='cp -i'

alias dir='ls -l'

alias ls='ls --color'

alias mv='mv -i'

alias rm='rm -i'

Zauważ, że niektóre komendy [Author ID2: at Fri Nov 2 09:09:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:09:00 2001 ]posiadają aliasy samych siebie. Na przykład komenda [Author ID2: at Fri Nov 2 09:09:00 2001 ]rm -i posiada alias rm. Efekt jest taki, że komenda[Author ID2: at Fri Nov 2 09:09:00 2001 ] [Author ID2: at Fri Nov 2 09:09:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:09:00 2001 ]rm używa opcji -i niezależnie od tego,[Author ID2: at Fri Nov 2 09:09:00 2001 ] czy wpiszesz ją w wierszu poleceń czy też nie; a określa on,[Author ID2: at Fri Nov 2 09:09:00 2001 ]a[Author ID2: at Fri Nov 2 09:09:00 2001 ] czy powłoka ma prosić o potwierdzenie wykonania polecenia rm (usunięcia plików). Zapobiega to przypadkowemu usunięciu plików, które mogłoby się okazać fatalne w skutkach,[Author ID2: at Fri Nov 2 09:10:00 2001 ] zwłaszcza,[Author ID2: at Fri Nov 2 09:10:00 2001 ] jeśli jesteś zalogowany jako root i usunąłeś właśnie ważne pliki systemowe. Jeśli nie chcesz być pytany o potwierdzenie usuwania plików,[Author ID2: at Fri Nov 2 09:10:00 2001 ] wydaj polecenie:

rm -f pliki

gdzie pliki to nazwy plików do usunięcia. Opcja -f posiada odwrotne do opcji -i znaczenie: wymusza usuwanie bez potwierdzania. Ponieważ komenda [Author ID2: at Fri Nov 2 09:10:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:10:00 2001 ]posiada alias, tak naprawdę wygląda tak[Author ID2: at Wed Nov 7 11:57:00 2001 ]następująco[Author ID2: at Wed Nov 7 11:57:00 2001 ]:

rm -i -f files[Author ID2: at Wed Nov 7 11:57:00 2001 ]pliki[Author ID2: at Wed Nov 7 11:57:00 2001 ]

Opcja -f jest tutaj nadrzędna, tzn. tylko ona jest brana pod uwagę,[Author ID2: at Fri Nov 2 09:10:00 2001 ] gdyż występuje dalej w linii komendy[Author ID2: at Fri Nov 2 09:10:00 2001 ]wierszu polecenia[Author ID2: at Fri Nov 2 09:10:00 2001 ].

Jeśli chcesz usunąć alias, wydaj polecenie unalias:

unalias alias

gdzie zmienna alias określa alias, który chcesz usunąć. Takie skróty poleceń są ważne tylko podczas trwania bieżącej sesji, więc tak naprawdę nie musisz ich wcale usuwać. Jeżeli jednak chciałbyś zachować jakiś alias,[Author ID2: at Wed Nov 7 11:58:00 2001 ] po to,[Author ID2: at Wed Nov 7 11:58:00 2001 ] by móc go używać następnym razem,[Author ID2: at Fri Nov 2 09:17:00 2001 ] musisz skorzystać ze skryptów, które są opisane w następnej [Author ID2: at Fri Nov 2 09:17:00 2001 ]następnym [Author ID2: at Fri Nov 2 09:17:00 2001 ]sekcji[Author ID2: at Fri Nov 2 09:17:00 2001 ]podrozdziale[Author ID2: at Fri Nov 2 09:17:00 2001 ].

Skrypty powłoki

Skrypt jest prostym plikiem zawierającym polecenia systemu. Przechowywanie komend [Author ID2: at Fri Nov 2 09:17:00 2001 ]poleceń [Author ID2: at Fri Nov 2 09:17:00 2001 ]w plikach ułatwia ich ponowne uruchamianie. Jako przykład,[Author ID2: at Wed Nov 7 11:58:00 2001 ] rozważ skrypt o nazwie usuwacz, który zawiera następujące linie[Author ID2: at Fri Nov 2 09:17:00 2001 ]wiersze[Author ID2: at Fri Nov 2 09:17:00 2001 ]:

echo -n Deleting the temporary files....

rm -f *.tmp

echo Done

Polecenie echo powoduje wyświetlenie dowolnego tekstu na ekranie konsoli. Opcja -n pierwszej [Author ID2: at Fri Nov 2 09:18:00 2001 ]pierwszego [Author ID2: at Fri Nov 2 09:18:00 2001 ]komendy [Author ID2: at Fri Nov 2 09:18:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:18:00 2001 ]echo powoduje ominięcie[Author ID2: at Wed Nov 7 11:59:00 2001 ]pomija[Author ID2: at Wed Nov 7 11:59:00 2001 ] znaku[Author ID2: at Wed Nov 7 11:59:00 2001 ] śladu nowej [Author ID2: at Fri Nov 2 09:18:00 2001 ]nowego [Author ID2: at Fri Nov 2 09:18:00 2001 ]linii [Author ID2: at Fri Nov 2 09:19:00 2001 ]wiersza[Author ID2: at Fri Nov 2 09:19:00 2001 ][Author ID2: at Wed Nov 7 11:58:00 2001 ] [Author ID2: at Fri Nov 2 09:19:00 2001 ]zapisywanej [Author ID2: at Fri Nov 2 09:19:00 2001 ]zapisywanego [Author ID2: at Fri Nov 2 09:19:00 2001 ]zazwyczaj przez tę komendę[Author ID2: at Fri Nov 2 09:19:00 2001 ]o polecenie[Author ID2: at Fri Nov 2 09:19:00 2001 ], tak że obydwi[Author ID2: at Fri Nov 2 09:19:00 2001 ]e [Author ID2: at Fri Nov 2 09:19:00 2001 ]oba [Author ID2: at Fri Nov 2 09:19:00 2001 ]komendy [Author ID2: at Fri Nov 2 09:19:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:19:00 2001 ]echo mogą wyświetlać swój tekst w osobnych liniach[Author ID2: at Fri Nov 2 09:19:00 2001 ]wierszach[Author ID2: at Fri Nov 2 09:19:00 2001 ]. Druga [Author ID2: at Fri Nov 2 09:20:00 2001 ]Drugi [Author ID2: at Fri Nov 2 09:20:00 2001 ]linia [Author ID2: at Fri Nov 2 09:20:00 2001 ]wiersz [Author ID2: at Fri Nov 2 09:20:00 2001 ]powoduje usunięcie z aktualnego katalogu roboczego wszystkich plików tymczasowych zakończonych rozszerzeniem .tmp.

Możesz wykonać ten skrypt wydając polecenie:

sh usuwacz

Uwaga

Jeśli wydasz polecenie sh bez nazwy skryptu jako argumentu, zostanie uruchomiona nowa powłoka. Aby z niej wyjść i powrócić do poprzedniej sesji,[Author ID2: at Fri Nov 2 09:20:00 2001 ] wpisz polecenie exit.

Jeśli plik usuwacz znajduje się w katalogu nie będącym na ścieżce $PATH, musisz podać bezwzględną nazwę ścieżki, na przykład:

sh /home/jasio/usuwacz

Aby ułatwić wykonywanie skryptu,[Author ID2: at Fri Nov 2 09:20:00 2001 ] trzeba ustawić prawo wykonywania ([Author ID2: at Wed Nov 7 11:59:00 2001 ]x)[Author ID2: at Wed Nov 7 11:59:00 2001 ] dla użytkownika, który będzie mógł go uruchamiać[Author ID2: at Wed Nov 7 11:59:00 2001 ]. Aby nadać wszystkim użytkownikom takie prawo dostępu, wprowadź komendę[Author ID2: at Fri Nov 2 09:21:00 2001 ]polecenie[Author ID2: at Fri Nov 2 09:21:00 2001 ]:

chmod a+x usuwacz

Teraz możesz wydać polecenie:

/home/jasio/usuwacz

Jeśli plik ten znajduje się w obecnym katalogu roboczym,[Author ID2: at Fri Nov 2 09:21:00 2001 ] możesz wpisać tylko:

./usuwacz

Zastanawiasz się zapewne,[Author ID2: at Fri Nov 2 09:21:00 2001 ] dlaczego nie możesz wydać takiego polecenia:

usuwacz

Wprawdzie jest to najprostsza forma uruchamiania poleceń,[Author ID2: at Fri Nov 2 09:21:00 2001 ] ale działa tylko w przypadku,[Author ID2: at Fri Nov 2 09:21:00 2001 ] gdy plik znajduje się w katalogu wpisanym do ścieżki systemowej. O ścieżkach systemowych przeczytasz trochę później[Author ID2: at Fri Nov 2 09:21:00 2001 ]jeszcze w tym rozdziale[Author ID2: at Fri Nov 2 09:21:00 2001 ].

System Linux zawiera kilka standardowych skryptów, które są uruchamiane o określonym czasie. Tabela 13.6 przedstawia te [Author ID2: at Fri Nov 2 12:23:00 2001 ]skrypty i opisuje moment ich wykonywania. Możesz spowodować,[Author ID2: at Fri Nov 2 09:22:00 2001 ] aby działały inaczej modyfikując je[Author ID2: at Wed Nov 7 12:00:00 2001 ]inaczej[Author ID2: at Wed Nov 7 12:00:00 2001 ]. Na przykład, jeśli chcesz ustanowić globalne aliasy, które będą uruchamiane niezależnie od tego,[Author ID2: at Wed Nov 7 12:00:00 2001 ] kiedy i gdzie będziesz się logował, użyj dowolnego edytora tekstowego i wprowadź odpowiednie linie [Author ID2: at Fri Nov 2 09:22:00 2001 ]wiersze [Author ID2: at Fri Nov 2 09:22:00 2001 ]do pliku .profile, który znajduje się w Twoim [Author ID2: at Fri Nov 2 09:22:00 2001 ] [Author ID2: at Fri Nov 2 09:22:00 2001 ]katalogu macierzystym. Przypomnij sobie, że,[Author ID2: at Wed Nov 7 12:00:00 2001 ] jeśli nazwy plików rozpoczynają się od kropki, oznacza to, że komenda [Author ID2: at Fri Nov 2 09:22:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:22:00 2001 ]ls nie wyświetli ich,[Author ID2: at Fri Nov 2 09:22:00 2001 ] dopóki nie podasz opcji -a.

Tabela 13.6. Standardowe skrypty Linuksa

Skrypt

Funkcja

/etc/profile

Wykonywany w czasie logowania się użytkownika.[Author ID2: at Fri Nov 2 09:23:00 2001 ]

~/.profile

Wykonywany w czasie logowania się użytkownika.[Author ID2: at Fri Nov 2 09:23:00 2001 ]

~/.bashrc

Wykonywany podczas uruchamiania powłoki BASH.[Author ID2: at Fri Nov 2 09:23:00 2001 ]

~/.bash_logout

Uwaga

Jeśli chcesz zmodyfikować jeden ze standardowych skryptów Linuksa, który powinien znajdować się w Twoim [Author ID2: at Fri Nov 2 09:23:00 2001 ]katalogu roboczym,[Author ID2: at Fri Nov 2 09:23:00 2001 ] ale niestety go nie ma, po prostu go tam utwórz. Następnym razem,[Author ID2: at Fri Nov 2 09:23:00 2001 ] gdy się zalogujesz, wylogujesz lub uruchomisz powłokę BASH, odpowiednio [Author ID2: at Fri Nov 2 09:24:00 2001 ]zostanie on uruchomiony.

Przekierowanie i przekazywanie wejścia-wyjścia

Powłoka dostarcza[Author ID2: at Wed Nov 7 12:01:00 2001 ]obsługuje[Author ID2: at Wed Nov 7 12:01:00 2001 ] [Author ID2: at Wed Nov 7 12:01:00 2001 ] [Author ID2: at Wed Nov 7 12:01:00 2001 ]standardowo [Author ID2: at Wed Nov 7 12:01:00 2001 ]trzech[Author ID2: at Wed Nov 7 12:01:00 2001 ]y[Author ID2: at Wed Nov 7 12:01:00 2001 ] strumienie[Author ID2: at Wed Nov 7 12:01:00 2001 ] danych:

Domyślnie, większość programów czyta dane wejściowe z stdin,[Author ID2: at Fri Nov 2 09:27:00 2001 ] a zapisuje wyjście do stdout. Ponieważ oba strumienie są normalnie [Author ID2: at Wed Nov 7 12:01:00 2001 ]zwykle [Author ID2: at Wed Nov 7 12:01:00 2001 ]związane z konsolą, programy zachowują się dokładnie tak,[Author ID2: at Fri Nov 2 09:27:00 2001 ] jak im każesz; czytając[Author ID2: at Wed Nov 7 12:01:00 2001 ] dane wejściowe z klawiatury i[Author ID2: at Fri Nov 2 09:27:00 2001 ] a[Author ID2: at Fri Nov 2 09:27:00 2001 ] zapisując[Author ID2: at Wed Nov 7 12:02:00 2001 ] wyjście na ekranie konsoli. Kiedy program wyświetla komunikat o błędzie, zapisuje go do strumienia stderr, który również jest związany domyślnie z konsolą. Posiadanie oddzielnego[Author ID2: at Wed Nov 7 12:02:00 2001 ]Oddzielny[Author ID2: at Wed Nov 7 12:02:00 2001 ] strumienia [Author ID2: at Wed Nov 7 12:02:00 2001 ]strumień [Author ID2: at Wed Nov 7 12:02:00 2001 ]dla informacji wyjściowych i wiadomości o błędach ma bardzo ważne znaczenie, co [Author ID2: at Fri Nov 2 09:28:00 2001 ]o czym się [Author ID2: at Fri Nov 2 09:28:00 2001 ]za moment zobaczy[Author ID2: at Fri Nov 2 09:28:00 2001 ]przekona[Author ID2: at Fri Nov 2 09:28:00 2001 ]sz.

Chociaż powłoka domyślnie wiąże trzy standardowe strumienie danych z konsolą, możesz przekierowywać wejścia i wyjścia w taki sposób, że na przykład skierujesz wejście strumienia danych lub wyjście do pliku. Tabela 13.7 podsumowuje najważniejsze tak zwane zwrotnice.

Tabela 13.7. Zwrotnice wejścia-wyjścia

Zwrotnica

Funkcja

>plik

Wysyła standardowe wyjście do określonego pliku.

2>plik

Wysyła standardowy strumień błędów do określonego pliku.

>>plik

Wysyła standardowe wyjście do określonego pliku, dodając wyjście do pliku,[Author ID2: at Fri Nov 2 09:32:00 2001 ] jeśli ten już istnieje.

2>>plik

Wysyła standardowe strumień błędów do określonego pliku, dodając wyjście do pliku,[Author ID2: at Fri Nov 2 09:32:00 2001 ] jeśli ten już istnieje.

&>plik

Wysyła standardowe wyjście i strumień błędów do określonego pliku.

<plik

Wysyła plik do standardowego wejścia programu.

<<tekst

kmd1 | kmd2

Bierze[Author ID2: at Wed Nov 7 12:03:00 2001 ] standardowe wejście kmd2 (np. komendy [Author ID2: at Fri Nov 2 09:34:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:34:00 2001 ]2) ze standardowego wyjścia kmd1 (ko[Author ID2: at Fri Nov 2 09:34:00 2001 ]mendy pierwszej[Author ID2: at Fri Nov 2 09:34:00 2001 ]pierwszego polecenia[Author ID2: at Fri Nov 2 09:34:00 2001 ]). Znak | jest również zwany przekierowaniem potoku [Author ID2: at Fri Nov 2 09:34:00 2001 ]lub po prostu przekaźnikiem.

Na przykładzie polecenia wc sprawdzimy,[Author ID2: at Fri Nov 2 09:34:00 2001 ] jak działają zwrotnice (pipes). Komenda ta[Author ID2: at Fri Nov 2 09:35:00 2001 ]Polecenie[Author ID2: at Fri Nov 2 09:35:00 2001 ] przyjmuje jako argument nazwę pliku (lub kilku) i wyświetla odpowiednio [Author ID2: at Fri Nov 2 09:35:00 2001 ]: całkowitą ilość linii[Author ID2: at Fri Nov 2 09:35:00 2001 ]liczbę wierszy[Author ID2: at Fri Nov 2 09:35:00 2001 ], słów i znaków obecnych w pliku. Zobaczmy:

wc /etc/passwd

powinieneś otrzymać coś w podobie[Author ID2: at Fri Nov 2 12:25:00 2001 ]:

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]16 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]20 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]570 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]/etc/passwd

co oznacza, że plik /etc/passwd zawiera 16 linii[Author ID2: at Fri Nov 2 09:36:00 2001 ]wierszy[Author ID2: at Fri Nov 2 09:36:00 2001 ], 20 słów i 570 znaków. Generalnie w[Author ID2: at Fri Nov 2 09:36:00 2001 ]W[Author ID2: at Fri Nov 2 09:36:00 2001 ]yjście komendy [Author ID2: at Fri Nov 2 09:36:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:36:00 2001 ]pojawia się na konsoli. Ale biorąc pod uwagę to samo polecenie, które zawiera zwrotnicę:

wc /etc/passwd > total

n[Author ID2: at Sun Nov 4 19:11:00 2001 ]N[Author ID2: at Sun Nov 4 19:11:00 2001 ]a konsoli nie pojawiły się żadne informacje, ponieważ wszystkie dane zostały skierowane i zapisane w pliku total,[Author ID2: at Sun Nov 4 19:11:00 2001 ] stworzonym przez polecenie (lub nadpisane, jeśli plik już istniał). Wydaj teraz dwa polecenia:

wc /etc/passwd > total

cat total

a zobaczysz wyjście komendy [Author ID2: at Fri Nov 2 09:37:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:37:00 2001 ]wc znów [Author ID2: at Fri Nov 2 09:37:00 2001 ]na konsoli.

Być może rozumiesz już przyczynę,[Author ID2: at Fri Nov 2 09:37:00 2001 ] dlaczego warto mieć oddzielny strumień wyjścia stdout i stderr. Jeśli powłoka dostarcza [Author ID2: at Wed Nov 7 12:04:00 2001 ]posiada [Author ID2: at Wed Nov 7 12:04:00 2001 ]jede[Author ID2: at Wed Nov 7 12:04:00 2001 ]nego[Author ID2: at Wed Nov 7 12:04:00 2001 ] strumienia [Author ID2: at Wed Nov 7 12:04:00 2001 ]strumień [Author ID2: at Wed Nov 7 12:04:00 2001 ]wyjścia, wiadomości o [Author ID2: at Fri Nov 2 09:40:00 2001 ]błędów [Author ID2: at Fri Nov 2 09:40:00 2001 ]błędach [Author ID2: at Fri Nov 2 09:40:00 2001 ]oraz wyjście poleceń mogą się mieszać. Dlatego, jeśli przekierujesz wyjście programu do pliku, każda informacja o błędzie zostanie też tam wysłana, co spowoduje, że łatwo będzie przeoczyć błąd wykonywanego programu. Zamiast tego, mając dwa oddzielne strumienie wyjścia, możesz przekierować tylko jedno z nich[Author ID2: at Wed Nov 7 12:05:00 2001 ],[Author ID2: at Wed Nov 7 12:05:00 2001 ] np.:[Author ID2: at Fri Nov 2 09:49:00 2001 ] stdout,[Author ID2: at Fri Nov 2 12:25:00 2001 ] do pliku. Kiedy tak zrobisz,[Author ID2: at Fri Nov 2 12:25:00 2001 ] informacje o błędach wysyłane do stderr pojawiają się na konsoli. Oczywiście, jeśli wolisz, możesz skierować stdout i stderr do tego samego pliku lub do dwóch różnych plików. Tak to już jest w systemie Unix, jak chcesz,[Author ID2: at Fri Nov 2 09:49:00 2001 ] tak masz.

Prostą metodą uniknięcia drażliwych wiadomości [Author ID2: at Fri Nov 2 09:49:00 2001 ]jest skierowanie ich do pliku pustego /[Author ID2: at Fri Nov 2 12:26:00 2001 ]dev/null. Jeśli skierujesz tam strumień stderr komendy[Author ID2: at Fri Nov 2 09:49:00 2001 ]polecenia[Author ID2: at Fri Nov 2 09:49:00 2001 ], nie zobaczysz żadnych informacji o jej błędach.

Tak jak można przekierować standardowe wyjście i strumień błędów komendy [Author ID2: at Fri Nov 2 09:50:00 2001 ]polecen[Author ID2: at Fri Nov 2 09:50:00 2001 ]ia [Author ID2: at Fri Nov 2 09:50:00 2001 ]do pliku, tak można również skierować wejście komendy [Author ID2: at Fri Nov 2 09:50:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:50:00 2001 ]do pliku, powodując, że komenda [Author ID2: at Fri Nov 2 09:50:00 2001 ]poleceni[Author ID2: at Fri Nov 2 09:50:00 2001 ]e[Author ID2: at Fri Nov 2 09:52:00 2001 ] [Author ID2: at Fri Nov 2 09:50:00 2001 ]będzie czytała[Author ID2: at Fri Nov 2 09:52:00 2001 ]czytało[Author ID2: at Fri Nov 2 09:52:00 2001 ],[Author ID2: at Wed Nov 7 12:05:00 2001 ] np.:[Author ID2: at Fri Nov 2 09:50:00 2001 ] argumenty,[Author ID2: at Fri Nov 2 09:50:00 2001 ] z pliku,[Author ID2: at Fri Nov 2 09:51:00 2001 ] a nie z konsoli. Weźmy na przykład [Author ID2: at Wed Nov 7 12:06:00 2001 ]komendę [Author ID2: at Fri Nov 2 09:53:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:53:00 2001 ]wc bez żadnych argumentów; polecenie to [Author ID2: at Wed Nov 7 12:06:00 2001 ]zacznie czytać dane ze standardowego wejścia stdin. Wpiszmy więc kilka słów,[Author ID2: at Wed Nov 7 12:06:00 2001 ] a następnie wciśnijmy [Author ID2: at Wed Nov 7 12:06:00 2001 ]naciśnijmy kombinację klawiszy [Author ID2: at Wed Nov 7 12:06:00 2001 ]Ctrl+D (jako znak końca),[Author ID2: at Fri Nov 2 09:53:00 2001 ] a program wc wyświetli nam,[Author ID2: at Fri Nov 2 09:53:00 2001 ] ile wprowadziliśmy linii[Author ID2: at Fri Nov 2 09:53:00 2001 ]wierszy[Author ID2: at Fri Nov 2 09:53:00 2001 ], słów i znaków. Możesz spowodować,[Author ID2: at Fri Nov 2 09:53:00 2001 ] żeby wc czytał z plik [Author ID2: at Fri Nov 2 09:53:00 2001 ]pliku [Author ID2: at Fri Nov 2 09:53:00 2001 ]zamiast z konsoli,[Author ID2: at Wed Nov 7 12:06:00 2001 ] wydając takie polecenie:

wc </etc/passwd

Oczywiście[Author ID3: at Tue Nov 13 18:13:00 2001 ] nie jest to typowe wywołanie komendy [Author ID2: at Fri Nov 2 09:54:00 2001 ]polecenia [Author ID2: at Fri Nov 2 09:54:00 2001 ]wc[Author ID2: at Fri Nov 2 12:27:00 2001 ],[Author ID2: at Fri Nov 2 09:54:00 2001 ] ponieważ standardowo komenda ta [Author ID2: at Fri Nov 2 09:54:00 2001 ]czyta ono [Author ID2: at Fri Nov 2 09:54:00 2001 ]dane z pliku, który jest podawany jako argument tego polecenia[Author ID2: at Fri Nov 2 09:54:00 2001 ]. Natomiast,[Author ID2: at Fri Nov 2 09:54:00 2001 ] jeśli nie podasz żadnego argumentu dla tego polecenia, wtedy czyta ono z standardowego wejścia.

Uwaga

Niektóre programy są tak napisane, że ignorują zwrotnice. Na przykład komenda [Author ID2: at Fri Nov 2 09:55:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:55:00 2001 ]passwd oczekuje wprowadzenia hasła tylko z konsoli (teoretycznie z klawiatury),[Author ID2: at Fri Nov 2 09:55:00 2001 ] a nie np.:[Author ID2: at Fri Nov 2 09:54:00 2001 ] z pliku. Istnieją oczywiście sposoby,[Author ID2: at Fri Nov 2 09:55:00 2001 ] aby zmusić taki program do czytania z pliku,[Author ID2: at Fri Nov 2 09:55:00 2001 ] ale aby tego dokonać trzeba poznać bardziej skomplikowane techniki niż zwrotnice.

Wiele jest takich programów, które, jeśli im nie podasz argumentów, czytają ze standardowego wejścia stdin,[Author ID2: at Fri Nov 2 09:55:00 2001 ] a zapisują do standardowego wyjścia stdout. Takie programy nazywamy filtrami. Mogą być one łączone ze sobą w celu wykonywania powiązanych zadań. Narzędziem do łączenia filtrów jest właśnie poznany wcześniej przekaźnik[Author ID2: at Fri Nov 2 09:55:00 2001 ]potok[Author ID2: at Fri Nov 2 09:55:00 2001 ], który łączy wyjście jednego programu z wejściem drugiego. Dla przykładu rozważmy polecenie:

ls -l ~ | wc -l

Polecenie to składa się z dwóch komend[Author ID2: at Fri Nov 2 09:56:00 2001 ]poleceń[Author ID2: at Fri Nov 2 09:56:00 2001 ], połączonych za pomocą przekaźnika [Author ID2: at Fri Nov 2 09:57:00 2001 ]potoku [Author ID2: at Fri Nov 2 09:57:00 2001 ](|). Pierwsza [Author ID2: at Fri Nov 2 09:57:00 2001 ]Pierwsze [Author ID2: at Fri Nov 2 09:57:00 2001 ]komenda [Author ID2: at Fri Nov 2 09:57:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:57:00 2001 ]wyświetla wszystkie pliki z katalogu domowego aktualnego użytkownika, po jednym pliku w linii[Author ID2: at Fri Nov 2 09:58:00 2001 ]wierszu[Author ID2: at Fri Nov 2 09:58:00 2001 ]. Druga [Author ID2: at Fri Nov 2 09:58:00 2001 ]Drugie [Author ID2: at Fri Nov 2 09:58:00 2001 ]komenda [Author ID2: at Fri Nov 2 09:58:00 2001 ]polecenie [Author ID2: at Fri Nov 2 09:58:00 2001 ]uruchamia program wc z opcją -l, która powoduje, że polecenie to wyświetla tylko ilość linii[Author ID2: at Fri Nov 2 09:58:00 2001 ]liczbę wierszy[Author ID2: at Fri Nov 2 09:58:00 2001 ] a[Author ID2: at Fri Nov 2 09:58:00 2001 ] i[Author ID2: at Fri Nov 2 09:58:00 2001 ] nie przelicza także [Author ID2: at Fri Nov 2 09:58:00 2001 ]słów i znaków. Przekaźnik [Author ID2: at Fri Nov 2 10:00:00 2001 ]Potok [Author ID2: at Fri Nov 2 10:00:00 2001 ]wysyła wyjście komendy [Author ID2: at Fri Nov 2 10:00:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:00:00 2001 ]ls do polecenia wc, które liczy i wyświetla ilość linii[Author ID2: at Fri Nov 2 09:59:00 2001 ]liczbę wierszy[Author ID2: at Fri Nov 2 09:59:00 2001 ] na wyjściu,[Author ID2: at Fri Nov 2 09:59:00 2001 ] co jest równe ilości [Author ID2: at Fri Nov 2 09:59:00 2001 ]liczbę [Author ID2: at Fri Nov 2 09:59:00 2001 ]plików w danym katalogu.

Jest to bardzo prosty przykład doskonale oddający potęgę i wyrafinowanie powłoki Uniksa. Sam system nie zawiera bowiem komendy [Author ID2: at Fri Nov 2 10:01:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:01:00 2001 ]liczącej [Author ID2: at Fri Nov 2 10:01:00 2001 ]liczącego [Author ID2: at Fri Nov 2 10:01:00 2001 ]ilość plików [Author ID2: at Fri Nov 2 10:01:00 2001 ]pliki [Author ID2: at Fri Nov 2 10:01:00 2001 ]w katalogu i nawet jej nie potrzebuje. Prawdopodobnie nigdy taki program nie powstanie, ponieważ mało doświadczony użytkownik potrafi już napisać skrypt składający się z poleceń systemu Unix, który zastępuje taki program[Author ID2: at Wed Nov 7 12:07:00 2001 ].

Zmienne powłoki

Jeśli uczysz się programować, wiesz zatem, że programowanie przypomina algebrę. Język programowania i algebra pozwalają bowiem odwołać się do wartości poprzez nazwę.[Author ID2: at Wed Nov 7 12:10:00 2001 ];[Author ID2: at Wed Nov 7 12:10:00 2001 ] Posiadają [Author ID2: at Wed Nov 7 12:10:00 2001 ]posiadają [Author ID2: at Wed Nov 7 12:10:00 2001 ]również wyszukane mechanizmy do manipulacji nazwanymi zmiennymi.

Powłoka jest językiem programowania posiadającym własne prawa. Pozwala odwoływać się do zmiennych zwanych zmiennymi powłoki lub zmiennymi środowiskowymi. Aby przypisać wartość zmiennej powłoki,[Author ID2: at Fri Nov 2 10:01:00 2001 ] użyj komendy[Author ID2: at Fri Nov 2 10:01:00 2001 ]polecenia[Author ID2: at Fri Nov 2 10:01:00 2001 ], która [Author ID2: at Fri Nov 2 10:01:00 2001 ]które [Author ID2: at Fri Nov 2 10:01:00 2001 ]ma następującą składnię:

variable=value

Na przykład:

DifficultyLevel=1

przypisuje wartość równą 1 do zmiennej środowiskowej zwanej DifficultyLevel. W przeciwieństwie do zmiennych algebraicznych, zmienne powłoki mogą posiadać wartości nie-[Author ID2: at Fri Nov 2 10:02:00 2001 ]numeryczne. Na przykład:

Difficulty=medium

Zmienne środowiskowe są często używane w systemie Unix, ponieważ umożliwiają w prosty sposób na [Author ID2: at Wed Nov 7 12:10:00 2001 ]przeniesienie wartości z jednej [Author ID2: at Fri Nov 2 10:02:00 2001 ]jednego [Author ID2: at Fri Nov 2 10:02:00 2001 ]komendy [Author ID2: at Fri Nov 2 10:02:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:02:00 2001 ]do drug[Author ID2: at Fri Nov 2 10:02:00 2001 ]iej[Author ID2: at Fri Nov 2 10:02:00 2001 ]drugiego[Author ID2: at Fri Nov 2 10:02:00 2001 ]. Programy mogą otrzymywać wartości zmiennych i używać ich do modyfikacji własnych operacji; w podobny sposób korzystają z podawanych przez użytkownika argumentów.

Aby obejrzeć listę zmiennych środowiskowych, użyj polecenia set. Ponieważ może się zdarzyć, że będzie ich dużo, możesz użyć przekaźnika [Author ID2: at Fri Nov 2 10:02:00 2001 ]potoku [Author ID2: at Fri Nov 2 10:02:00 2001 ]i komendy [Author ID2: at Fri Nov 2 10:02:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:02:00 2001 ]more do oglądania wyjścia polecenia set po [Author ID2: at Fri Nov 2 10:03:00 2001 ]ekran [Author ID2: at Fri Nov 2 10:03:00 2001 ]jednym [Author ID2: at Fri Nov 2 10:03:00 2001 ]po [Author ID2: at Fri Nov 2 10:03:00 2001 ]ekranie:

set | more

Wciśnij Spację,[Author ID2: at Fri Nov 2 10:03:00 2001 ] aby zobaczyć następną stronę, [Author ID2: at Fri Nov 2 10:03:00 2001 ] lub [Author ID2: at Fri Nov 2 10:03:00 2001 ]Enter,[Author ID2: at Fri Nov 2 10:03:00 2001 ] aby obejrzeć następną [Author ID2: at Fri Nov 2 10:04:00 2001 ]następny [Author ID2: at Fri Nov 2 10:04:00 2001 ]linię[Author ID2: at Fri Nov 2 10:04:00 2001 ]w[Author ID2: at Fri Nov 2 10:04:00 2001 ]iersz[Author ID2: at Fri Nov 2 10:04:00 2001 ]. Wśród tych zmiennych, które zostaną wyświetlone na ekranie znajdziesz pewnie też te, które są przedstawione w tabeli 13.8. Wartości tych zmiennych są generalnie ustawiane przez standardowe skrypty startowe powłoki, o których była wcześniej już mowa.

Tabela 13.8. Ważne zmienne środowiskowe

Zmienna

Funkcja

DISPLAY

Używany serwer X, na przykład: localhost:0.[Author ID2: at Fri Nov 2 10:04:00 2001 ]

HOME

Ścieżka bezwzględna katalogu domowego użytkownika.

HOSTNAME

Internetowa nazwa komputera.

LOGNAME

Nazwa logowania użytkownika.

MAIL

Ścieżka bezwzględna katalogu poczty użytkownika.

PATH

Ścieżka przeszukiwań (zobacz w następnej sekcji).

SHELL

Ścieżka absolutna aktualnie używanej powłoki.

TERM

USER

Aktualna nazwa użytkownika, może się różnić od nazwy logowania, jeśli użytkownik wydał polecenie su[Author ID2: at Fri Nov 2 12:34:00 2001 ].

Wartość zmiennej środowiskowej możesz wstawić do polecenia,[Author ID2: at Wed Nov 7 12:12:00 2001 ] poprzedzając ją znakiem dolara ($). Aby nie zmieszała się ona z otaczającym tekstem (argumentami, opcjami itp.),[Author ID2: at Fri Nov 2 10:08:00 2001 ] zamknij ją w nawiasach klamrowych ({}). Jest to dobry zwyczaj, aczkolwiek nie wymagany. Na przykład,[Author ID2: at Fri Nov 2 10:08:00 2001 ] zmieńmy aktualny katalog roboczy na katalog domowy za pomocą zmiennej HOME:

cd ${HOME}

Oczywiście wydanie polecenia cd bez żadnych argumentów da nam ten sam efekt. Jednakże załóżmy, że chciałbyś zmienić aktualny katalog roboczy na podkatalog /praca znajdujący się w katalogu domowym. Poniższe polecenie, pokazuje jak tego dokonać:

cd ${HOME}/praca

Najłatwiejszym sposobem na wyświetlenie wartości zmiennej środowiskowej jest podanie zmiennej jako argumentu polecenia echo. Na przykład,[Author ID2: at Fri Nov 2 10:09:00 2001 ] sprawdźmy,[Author ID2: at Fri Nov 2 10:08:00 2001 ] jaka jest wartość zmiennej HOME:

echo ${HOME}

[Author ID2: at Fri Nov 2 10:09:00 2001 ]

Aby wartość zmiennej środowiskowej była dostępna nie tylko dla powłoki,[Author ID2: at Fri Nov 2 10:09:00 2001 ] ale także dla programów wywoływanych poprzez powłokę,[Author ID2: at Fri Nov 2 10:09:00 2001 ] należy tę wartość wy[Author ID2: at Wed Nov 7 12:12:00 2001 ]eksportować. Aby tego dokonać,[Author ID2: at Fri Nov 2 10:09:00 2001 ] użyj polecenia export:

export zmienna

gdzie zmienna oznacza nazwę zmiennej, którą chcesz eksportować. Podczas eksportowania zmiennej możesz również nadać jej nową wartość:

export zmienna=wartość

Wartość zmiennej możesz usunąć,[Author ID2: at Wed Nov 7 12:13:00 2001 ] podając[Author ID2: at Fri Nov 2 10:09:00 2001 ] zmiennej pustą wartość (wartość zerową)

zmienna=

Jednakże zmienna środowiskowa mająca nawet wartość zerową nadal pozostaje zmienną powłoki i pojawia się na wyjściu polecenia set. Aby ją stamtąd usunąć,[Author ID2: at Fri Nov 2 10:11:00 2001 ] wydaj komendę[Author ID2: at Fri Nov 2 10:11:00 2001 ]polecenie[Author ID2: at Fri Nov 2 10:11:00 2001 ]:

unset zmienna

Teraz, ni będzie się wyświetlać[Author ID2: at Fri Nov 2 10:12:00 2001 ] jej nie zobaczysz[Author ID2: at Fri Nov 2 10:12:00 2001 ] po wykonaniu polecenia set.

Ścieżki Przeszukiwań[Author ID2: at Fri Nov 2 10:12:00 2001 ]przeszukiwań[Author ID2: at Fri Nov 2 10:12:00 2001 ]

Specjalna zmienna powłoki PATH zawiera informacje na temat ścieżek zwanych ścieżkami przeszukiwań. Gdziekolwiek nie wydasz polecenia zewnętrznego, powłoka sprawdza tę zmienną,[Author ID2: at Fri Nov 2 10:15:00 2001 ] czy aby nie zawiera ścieżki umożliwiającej uruchomienie żądanego programu. Skrypty startowe ustanawiają początkową wartość zmiennej środowiskowej PATH, którą następnie można dowolnie modyfikować. Do oddzielenia ścieżek,[Author ID2: at Wed Nov 7 12:14:00 2001 ] użyj dwukropka (:).

Na przykład załóżmy, że zmienna PATH przyjmuje następującą wartośś[Author ID2: at Fri Nov 2 10:16:00 2001 ]wartość[Author ID2: at Fri Nov 2 10:16:00 2001 ]:

/usr/bin:/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin

Możesz zmodyfikować zmienną PATH, dodając nowy katalog przeszukiwań,[Author ID2: at Wed Nov 7 12:14:00 2001 ] np.:[Author ID2: at Fri Nov 2 10:16:00 2001 ] /home/magda,[Author ID2: at Fri Nov 2 10:17:00 2001 ] w taki [Author ID2: at Wed Nov 7 12:14:00 2001 ]następujący [Author ID2: at Wed Nov 7 12:14:00 2001 ]sposób:

PATH=${PATH}:/home/magda

Teraz p[Author ID2: at Wed Nov 7 12:15:00 2001 ]P[Author ID2: at Wed Nov 7 12:15:00 2001 ]owłoka będzie szukała programów zewnętrznych także w katalogu /home/magda. Jednakże będzie to ostatni katalog,[Author ID2: at Wed Nov 7 12:15:00 2001 ] do którego zajrzy. Jeśli chciałbyś,[Author ID2: at Fri Nov 2 10:16:00 2001 ] aby powłoka najpierw sprawdzała katalog /home/magda,[Author ID2: at Fri Nov 2 10:17:00 2001 ] wydaj polecenie:

PATH=/home/magda:${PATH}

Programem pomocnym przy manipulowaniu zmienną PATH jest which. Sprawdza on ścieżkę dla określonego pliku (który jest argumentem tego polecenia) i wyświetla nazwę pasującej ścieżki, jeśli taka istnieje. Na przykład,[Author ID2: at Fri Nov 2 10:19:00 2001 ] poszukajmy,[Author ID2: at Fri Nov 2 10:19:00 2001 ] gdzie znajduje się plik programu wc:

which wc

Na ekranie pojawić się powinna się ścieżka /usr/bin/wc lub inna zależna od wersji dystrybucji systemu Linux.

Łańcuchy notacji

Czasami powłoka może źle zinterpretować wydaną [Author ID2: at Fri Nov 2 10:19:00 2001 ]wydane [Author ID2: at Fri Nov 2 10:19:00 2001 ]komendę[Author ID2: at Fri Nov 2 10:19:00 2001 ]polecenie[Author ID2: at Fri Nov 2 10:19:00 2001 ], odwołując się do zmiennej, której wcale nie zamierzałeś przywoływać,[Author ID2: at Fri Nov 2 10:19:00 2001 ] czy źle rozwijając nazwę pliku. Oczywiście nie jest to wina powłoki, tylko prawdopodobnie błędnego wpisu. Dlatego tylko [Author ID2: at Fri Nov 2 10:19:00 2001 ]od Ciebie [Author ID2: at Fri Nov 2 10:19:00 2001 ]ciebie[Author ID2: at Fri Nov 2 10:19:00 2001 ] zależy[Author ID2: at Fri Nov 2 10:20:00 2001 ], [Author ID2: at Fri Nov 2 10:19:00 2001 ]tylko zależy [Author ID2: at Fri Nov 2 10:19:00 2001 ]czy powłoka będzie prawidłowo reagować na komendy [Author ID2: at Fri Nov 2 10:20:00 2001 ]polecenia[Author ID2: at Fri Nov 2 10:20:00 2001 ]czy nie[Author ID2: at Wed Nov 7 12:15:00 2001 ].

Znaki notacji przedstawione w tabel 13.9 pomagają kontrolować działanie powłoki. Na przykład,[Author ID2: at Fri Nov 2 12:35:00 2001 ],[Author ID2: at Fri Nov 2 10:20:00 2001 ] jeśli zamkniesz argument danego polecenia w pojedynczy cudzysłów, możesz zapobiec wykonywaniu na nim operacji uogólnienia nazwy lub zamienienia [Author ID2: at Fri Nov 2 10:20:00 2001 ]zamiany [Author ID2: at Fri Nov 2 10:20:00 2001 ]go na wartość zmiennej środowiskowej.

Tabela 13.9. Znaki notacji pomocne przy kontroli działań powłoki

Znak

Funkcja

Znaki objęte parą pojedynczych cudzysłowów są interpretowane literalnie [Author ID2: at Fri Nov 2 10:20:00 2001 ]to znaczy ich znaczenie meta [Author ID2: at Fri Nov 2 10:20:00 2001 ]znakowe (jeśli istnieje) jest ignorowane. Podobnie; [Author ID2: at Fri Nov 2 10:21:00 2001 ][Author ID2: at Fri Nov 2 10:21:00 2001 ]powłoka nie zamienia odnośników do zmiennych środowiskowych na ich wartości.

Znaki objęte zwykłym cudzysłowem są również interpretowane literalnie, to znaczy, że ich znaczenie meta [Author ID2: at Fri Nov 2 10:28:00 2001 ]znakowe (jeśli posiadają takowe) jest ignorowane. Jeśli chodzi o wartości zmiennych środowiskowych,[Author ID2: at Fri Nov 2 10:30:00 2001 ] to są one wstawiane w miejsce ich wywołań.

Tekst objęty parą przeciwnych cudzysłowów [Author ID2: at Fri Nov 2 10:31:00 2001 ]jest interpretowany jak komenda[Author ID2: at Fri Nov 2 10:31:00 2001 ]polecenie[Author ID2: at Fri Nov 2 10:31:00 2001 ], którą [Author ID2: at Fri Nov 2 10:31:00 2001 ]które [Author ID2: at Fri Nov 2 10:31:00 2001 ]powłoka wykonuje zanim przetworzy resztę wiersza polecenia. Wyjście komend[Author ID2: at Fri Nov 2 10:31:00 2001 ]y [Author ID2: at Fri Nov 2 10:31:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:31:00 2001 ]zamienia oryginalny tekst objęty tym cudzysłowem.

\

Znak ten jest interpretowany literalnie[Author ID2: at Fri Nov 2 10:31:00 2001 ],[Author ID2: at Fri Nov 2 10:31:00 2001 ] to znaczy, że jego meta [Author ID2: at Fri Nov 2 10:31:00 2001 ]znaczenie jest ignorowane. Znak tzw. backslash (odwrotny slash) oznacza kontynuację poprzedniej [Author ID2: at Fri Nov 2 10:31:00 2001 ]poprzedniego [Author ID2: at Fri Nov 2 10:31:00 2001 ]linii[Author ID2: at Fri Nov 2 10:32:00 2001 ]wiersza[Author ID2: at Fri Nov 2 10:32:00 2001 ]. Kiedy wiersz, np.:[Author ID2: at Fri Nov 2 10:32:00 2001 ] polecenia,[Author ID2: at Fri Nov 2 10:32:00 2001 ] kończy się tym znakiem, obecny wiersz i następna linia[Author ID2: at Fri Nov 2 10:32:00 2001 ]y są[Author ID2: at Fri Nov 2 10:32:00 2001 ] uważane[Author ID2: at Fri Nov 2 10:32:00 2001 ] za całość (jeden wiersz).

Sprawdźmy,[Author ID2: at Fri Nov 2 10:32:00 2001 ] jak to się wszystko odbywa w praktyce. Jako przykład wykorzystamy komendę [Author ID2: at Fri Nov 2 10:38:00 2001 ]polecenie [Author ID2: at Fri Nov 2 10:38:00 2001 ]echo do wyświetlenia napisu $PATH. Jeśli wydasz polecenie:

echo $PATH

komenda [Author ID2: at Fri Nov 2 10:38:00 2001 ]program [Author ID2: at Fri Nov 2 10:38:00 2001 ]echo wyświetli wszystkie wartość zmiennej PATH. Jednakże zamykając argument komendy [Author ID2: at Fri Nov 2 10:39:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:39:00 2001 ]echo w pojedynczy cudzysłów, otrzymasz żądany rezultat:

echo '$PATH'

Cudzysłów przeciwny[Author ID2: at Fri Nov 2 10:40:00 2001 ] działa nieco inaczej, pozwala on wykonać komendę [Author ID2: at Fri Nov 2 10:40:00 2001 ]polecenie [Author ID2: at Fri Nov 2 10:40:00 2001 ]i wykorzystać jej [Author ID2: at Fri Nov 2 10:40:00 2001 ]jego [Author ID2: at Fri Nov 2 10:40:00 2001 ]wyjście innemu poleceniu. Na przykład,[Author ID2: at Fri Nov 2 10:42:00 2001 ] polecenie:

echo Mój katalog domowy zawiera 'ls ~ | wc -l' plików

wyświetla wiadomość, która podaje ilość [Author ID2: at Fri Nov 2 10:40:00 2001 ]liczbę [Author ID2: at Fri Nov 2 10:40:00 2001 ]plików znajdujących się w katalogu domowym aktualnie zalogowanego użytkownika. Polecenie to działa tak[Author ID2: at Wed Nov 7 12:16:00 2001 ]następująco[Author ID2: at Wed Nov 7 12:16:00 2001 ]:[Author ID2: at Wed Nov 7 12:16:00 2001 ][Author ID2: at Wed Nov 7 12:16:00 2001 ] N[Author ID2: at Fri Nov 2 10:42:00 2001 ]n[Author ID2: at Fri Nov 2 10:42:00 2001 ]ajpierw wykonywana [Author ID2: at Fri Nov 2 10:40:00 2001 ]wykonywane [Author ID2: at Fri Nov 2 10:40:00 2001 ]jest komenda[Author ID2: at Fri Nov 2 10:40:00 2001 ]polecenie[Author ID2: at Fri Nov 2 10:40:00 2001 ]:

ls ~ | wc -l

Ponieważ [Author ID2: at Wed Nov 7 12:16:00 2001 ]a ponieważ [Author ID2: at Wed Nov 7 12:16:00 2001 ]polecenie to jest zawarte w przeciwnym cudzysłowu[Author ID2: at Fri Nov 2 10:41:00 2001 ], jego wynik nie jest wyświetlany na ekranie,[Author ID2: at Fri Nov 2 10:41:00 2001 ] ale zastępuje oryginalny tekst objęty cudzysłowem.

Następnie [Author ID2: at Wed Nov 7 12:16:00 2001 ]następnie [Author ID2: at Wed Nov 7 12:16:00 2001 ]jest [Author ID2: at Fri Nov 2 10:42:00 2001 ]wykonywana [Author ID2: at Fri Nov 2 10:42:00 2001 ]wykonywane [Author ID2: at Fri Nov 2 10:42:00 2001 ]jest[Author ID2: at Fri Nov 2 10:42:00 2001 ] komenda[Author ID2: at Fri Nov 2 10:42:00 2001 ]polecenie[Author ID2: at Fri Nov 2 10:42:00 2001 ]: [Author ID2: at Fri Nov 2 11:19:00 2001 ][Author ID2: at Fri Nov 2 10:42:00 2001 ]

[Author ID2: at Sun Nov 4 19:04:00 2001 ]

echo Mój katalog domowy zawiera 48 plików

Po [Author ID2: at Wed Nov 7 12:16:00 2001 ]po [Author ID2: at Wed Nov 7 12:16:00 2001 ]zakończeniu wyjście komendy [Author ID2: at Fri Nov 2 10:41:00 2001 ]polecenia [Author ID2: at Fri Nov 2 10:41:00 2001 ]wygląda tak[Author ID2: at Sun Nov 4 19:04:00 2001 ]przyjmuje postać[Author ID2: at Sun Nov 4 19:04:00 2001 ]:

Mój katalog domowy zawiera 48 plików.

Potęga powłoki Linuksa

Mam nadzieję, że zaczynasz powoli doceniać siłę powłoki systemu Linux; dołączając aliasy poleceń do pliku .bashrc,[Author ID2: at Fri Nov 2 10:45:00 2001 ] możesz rozszerzyć zakres poleceń powłoki. Przy użyciu dopełniania nazw plików i listy historii możesz zredukować ilość niepotrzebnych znaków wprowadzanych z klawiatury do minimum. Kiedy już dowiesz się,[Author ID2: at Fri Nov 2 10:45:00 2001 ] jak poprawnie używać wszystkich tych właściwości, okaże się, że powłoka jest silnym, szybkim i bardzo łatwym w użyciu interfejsem użytkownika, który nie jest tak monotonny i ograniczony jak interfejs graficzny oparty na klikaniu.

Co więcej, powłoka posiada dodatkowe funkcje, które jeszcze bardziej rozszerzają obszar jej zastosowań. Jak zobaczysz w następnej sekcji[Author ID2: at Fri Nov 2 10:46:00 2001 ]ym podrozdziale[Author ID2: at Fri Nov 2 10:46:00 2001 ], powłoka systemu Linux zawiera wydajny język programowania, który umożliwia przetwarzanie argumentów, tworzenie pętli i stawiania warunków logicznych.

Poznawanie skryptów powłoki

Ta sekcja[Author ID2: at Fri Nov 2 10:46:00 2001 ]Podrozdział[Author ID2: at Fri Nov 2 10:46:00 2001 ] wyjaśnia,[Author ID2: at Fri Nov 2 10:46:00 2001 ] jak działają bardziej zaawansowane skrypty powłoki. Informacje są przedstawione po to,[Author ID2: at Fri Nov 2 10:46:00 2001 ] abyś szybko i wydajnie [Author ID2: at Fri Nov 2 10:46:00 2001 ]mógł pisać swoje [Author ID2: at Wed Nov 7 12:17:00 2001 ]własne [Author ID2: at Wed Nov 7 12:17:00 2001 ]skrypty, szybko i wydajnie[Author ID2: at Fri Nov 2 10:46:00 2001 ]. Rozpoczynamy od przetwarzania argumentów skryptów,[Author ID2: at Fri Nov 2 10:46:00 2001 ] a następnie przejdziemy do operacji warunkowych i logicznych.

Przetwarzanie argumentów

Z łatwością można napisać program, który będzie przetwarzał argumenty, ponieważ istnieje zestaw specjalnych zmiennych powłoki, który zawiera wartości dla argumentów określanych podczas inicjalizacji skryptu. Tabela 13.10 przedstawia te zmienne.

Na przykład, oto[Author ID2: at Fri Nov 2 11:34:00 2001 ]Oto [Author ID2: at Fri Nov 2 11:34:00 2001 ] [Author ID2: at Fri Nov 2 11:34:00 2001 ]prosty program, który wyświetla wartość swojego drugiego argumentu:

echo Mój drugi argument ma wartość $2

Załóżmy, że zapiszesz ten skrypt do pliku o nazwie drugi; zmień tryb dostępu tak,[Author ID2: at Fri Nov 2 11:34:00 2001 ] aby mógł być wykonywany
i wydaj polecenie:

./drugi a b c

Na wyjściu pojawi się wynik tej operacji:

Mój drugi argument ma wartość b.[Author ID2: at Wed Nov 7 12:18:00 2001 ]

[Author ID2: at Sun Nov 4 19:05:00 2001 ]

Tabela 13.10. Specjalne zmienne powłoki

Zmienna

Znaczenie

$#

$0

$1, $2,...,$9

$*

Cała lista argumentów, traktowana jako pojedyncze słowo.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

$@

Cała lista argumentów, traktowana jako seria słów.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

$?

$$

Id (identyfikator) aktywnego procesu

Zwróć uwagę na fakt, że powłoka pozwala odwołać się bezpośrednio tylko do dziewięciu argumentów. Niemniej jednak istnieje możliwość przywołania większej liczby argumentów. Służy do tego polecenie shift, które odrzuca wartość pierwszego argumentu i przesuwa pozostałe wartości o jedną pozycję w dół (lub [Author ID2: at Wed Nov 7 12:20:00 2001 ]do góry). Tym sposobem po wykonaniu komendy [Author ID2: at Fri Nov 2 11:35:00 2001 ]polecenia [Author ID2: at Fri Nov 2 11:35:00 2001 ]shift,[Author ID2: at Fri Nov 2 11:35:00 2001 ] zmienna powłoki $9 zawiera wartość dziesiątego argumentu. Aby przywołać jedenasty lub każdy następny argument, należy wykonać komendę [Author ID2: at Fri Nov 2 11:36:00 2001 ]polecenie [Author ID2: at Fri Nov 2 11:36:00 2001 ]shift odpowiednią ilość razy.

Kody wyjścia

Zmienna powłoki $? utrzymuje numeryczny status wyjścia dla każdej [Author ID2: at Fri Nov 2 11:36:00 2001 ]każdego [Author ID2: at Fri Nov 2 11:36:00 2001 ]ostatnio wykonanej [Author ID2: at Fri Nov 2 11:36:00 2001 ]wykonanego [Author ID2: at Fri Nov 2 11:36:00 2001 ]komendy[Author ID2: at Fri Nov 2 11:36:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:36:00 2001 ]. Zasada jest taka, że wartość zerowa tej zmiennej oznacza pomyślne zakończenie programu, tymczasem każda inna wartość oznacza nieprawidłowe wykonanie komendy[Author ID2: at Fri Nov 2 11:36:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:36:00 2001 ].

Kod błędu możesz ustawić w skrypcie, przy [Author ID2: at Fri Nov 2 11:36:00 2001 ]za [Author ID2: at Fri Nov 2 11:36:00 2001 ]pomocy [Author ID2: at Fri Nov 2 11:36:00 2001 ]pomocą [Author ID2: at Fri Nov 2 11:36:00 2001 ]polecenia exit, które kończy pracę skryptu podając określony status wyjścia. Składa[Author ID2: at Fri Nov 2 11:36:00 2001 ]nia[Author ID2: at Fri Nov 2 11:36:00 2001 ] polecenia [Author ID2: at Fri Nov 2 11:37:00 2001 ]exit jest następująca:

exit status

gdzie status jest nieujemną liczbą całkowitą, która określa status wyjścia.

Logika warunkowa

Skrypty powłoki mogą używać logiki warunkowej, która pozwala im podejmować różne działania w zależności od wartości argumentów, zmiennych środowiskowych lub ich warunków. Na przykład polecenie test pozwala określić warunek, który może być albo prawdziwy,[Author ID2: at Wed Nov 7 12:22:00 2001 ] albo fałszywy. Wszystkie polecenia warunkowe (włączając if, case, while oraz komendę [Author ID2: at Fri Nov 2 11:37:00 2001 ]until) używają polecenia test do szacowania warunków.

Komenda [Author ID2: at Fri Nov 2 11:37:00 2001 ]Polecenie [Author ID2: at Fri Nov 2 11:37:00 2001 ]test

Tabela 13.11 przedstawia opis niektórych powszechnie stosowanych form[Author ID2: at Wed Nov 7 12:22:00 2001 ] argumentów używanych do polecenia test. Komenda ta[Author ID2: at Fri Nov 2 11:37:00 2001 ]Polecenie[Author ID2: at Fri Nov 2 11:37:00 2001 ] sprawdza swoje [Author ID2: at Wed Nov 7 12:22:00 2001 ]argumenty i ustawia kod wyjściowy na zero, co oznacza, że dany warunek był prawdziwy lub podaje wartość większą od zera, która mówi, że warunek był nieprawdziwy.

Tabela 13.11. Powszechnie używane formy argumentów polecenia test

Forma

Funkcja

-d plik

Określony plik istnieje i jest katalogiem.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-e plik

-r plik

Określony plik istnieje i jest do odczytu.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-s plik

Określony plik istnieje i ma niezerowy rozmiar.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-w plik

Określony plik istnieje i jest do zapisu.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-x plik

Określony plik istnieje i jest wykonywalny.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-L plik

f1 -nt f2

Plik f1 jest nowszy niż plik f2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

f1 -ot f2

Plik f1 jest starszy niż plik f2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-n s1

Łańcuch s1 ma niezerową długość.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

-z s1

Łańcuch s1 ma zerową długość.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

s1 = s2

Łańcuch s1 jest taki sam jak s2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

s1 =! s2

Łańcuch s1 nie jest taki sam jak s2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -eq n2

Liczba całkowita n1 jest równa liczbie n2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -ge n2

Liczba całkowita n1 jest większa bądź równa liczbie n2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -gt n2

Liczba całkowita n1 jest większa niż liczba n2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -le n2

Liczba całkowita n1 jest mniejsza bądź równa liczbie całkowitej n2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -lt n2

Liczba całkowita n1 jest mniejsza niz liczba n2.[Author ID2: at Sun Nov 4 19:05:00 2001 ]

n1 -ne n2

Liczba n1 nie jest równa liczbie n2.[Author ID2: at Sun Nov 4 19:06:00 2001 ]

!

Operator przeczenia (not — nie), który odwraca wartość danego warunku.[Author ID2: at Sun Nov 4 19:06:00 2001 ]

-a

Operator łączności[Author ID2: at Fri Nov 2 11:38:00 2001 ] (and — i), który łączy dwa warunki. Oba warunki muszą być prawdziwe,[Author ID2: at Fri Nov 2 11:38:00 2001 ] aby całkowity rezultat dał prawdziwy wynik.[Author ID2: at Sun Nov 4 19:06:00 2001 ]

-o

Operator alternatywy, który łączy dwa warunki. Jeśli jeden z dwóch warunków jest prawdziwy,[Author ID2: at Fri Nov 2 12:37:00 2001 ] wynik jest rownież prawdziwy.[Author ID2: at Sun Nov 4 19:06:00 2001 ]

\( ... \)

Wyrażenia w poleceniu test można grupować zamykając je w \( i \).[Author ID2: at Sun Nov 4 19:06:00 2001 ]

Dla przykładu rozważmy taki skrypt:

test -d $1

echo $?

Skrypt ten sprawdza,[Author ID2: at Fri Nov 2 11:38:00 2001 ] czy pierwszy argument określa katalog i wyświetla status wyjścia, wartość zero lub inną w zależności od wyniku testu.

Załóżmy, że powyższe polecenia są przechowywane w pliku tester, któr[Author ID2: at Fri Nov 2 11:39:00 2001 ]y[Author ID2: at Fri Nov 2 11:39:00 2001 ] posiadający[Author ID2: at Fri Nov 2 11:39:00 2001 ] atrybut do odczytu o [Author ID2: at Fri Nov 2 11:39:00 2001 ]raz do wykonania. Wykonanie tego skryptu może dawać następujące wyniki:

$ ./tester /

0

$ ./tester /missing

1

Oznaczają one odpowiednio: 0 — katalog / istnieje,[Author ID2: at Fri Nov 2 11:39:00 2001 ] a wartość[Author ID2: at Fri Nov 2 11:39:00 2001 ] 1 [Author ID2: at Fri Nov 2 11:39:00 2001 ]katalog /missing nie istnieje.

Komenda [Author ID2: at Fri Nov 2 11:39:00 2001 ]Poleceni[Author ID2: at Fri Nov 2 11:39:00 2001 ]e [Author ID2: at Fri Nov 2 11:39:00 2001 ]if

Sama komenda[Author ID2: at Fri Nov 2 11:39:00 2001 ]o polecenie[Author ID2: at Fri Nov 2 11:39:00 2001 ] test nie jest zbyt przydatna[Author ID2: at Fri Nov 2 11:39:00 2001 ]przydatne[Author ID2: at Fri Nov 2 11:39:00 2001 ], chyba że zostanie użyta [Author ID2: at Fri Nov 2 11:39:00 2001 ]użyte [Author ID2: at Fri Nov 2 11:39:00 2001 ]w połączeniu z innymi instrukcjami warunkowymi; [Author ID2: at Fri Nov 2 11:40:00 2001 ][Author ID2: at Fri Nov 2 11:40:00 2001 ]na przykład z poleceniem if. [Author ID2: at Fri Nov 2 12:38:00 2001 ]Składnia komendy [Author ID2: at Fri Nov 2 11:40:00 2001 ]polecenia [Author ID2: at Fri Nov 2 11:40:00 2001 ]if[Author ID2: at Fri Nov 2 11:40:00 2001 ] jest następująca:

if komenda[Author ID2: at Fri Nov 2 11:40:00 2001 ]polecenie[Author ID2: at Fri Nov 2 11:40:00 2001 ]

then

kom[Author ID2: at Fri Nov 2 11:40:00 2001 ]endy[Author ID2: at Fri Nov 2 11:40:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:40:00 2001 ]

else komendy[Author ID2: at Fri Nov 2 11:40:00 2001 ]plecenia[Author ID2: at Fri Nov 2 11:40:00 2001 ]

fi

Zazwyczaj komendą[Author ID2: at Fri Nov 2 11:40:00 2001 ]poleceniem[Author ID2: at Fri Nov 2 11:40:00 2001 ], która [Author ID2: at Fri Nov 2 11:40:00 2001 ]które [Author ID2: at Fri Nov 2 11:40:00 2001 ]występuje bezpośrednio po poleceniu if jest test. Jednakże, nie jest to warunkiem koniecznym. Polecenie if jedynie wykonuje określoną komendę [Author ID2: at Fri Nov 2 11:41:00 2001 ]warunki [Author ID2: at Fri Nov 2 11:41:00 2001 ]i sprawdza jej[Author ID2: at Fri Nov 2 11:41:00 2001 ] status wyjścia. Jeśli jest on równy 0, wykonywany jest pierwszy zestaw komend[Author ID2: at Fri Nov 2 11:41:00 2001 ]poleceń[Author ID2: at Fri Nov 2 11:41:00 2001 ], jeśli nie wykonywany jest drugi zestaw. Skrócona forma polecenia if[Author ID2: at Fri Nov 2 12:38:00 2001 ] nie robi nic,[Author ID2: at Fri Nov 2 11:41:00 2001 ] jeśli określony warunek jest nieprawdziwy.

if polecenie[Author ID2: at Fri Nov 2 11:41:00 2001 ]komenda[Author ID2: at Fri Nov 2 11:41:00 2001 ]

then

polecenie[Author ID2: at Fri Nov 2 11:41:00 2001 ]komenda[Author ID2: at Fri Nov 2 11:41:00 2001 ]

fi

Kiedy wpisujesz polecenie if, zajmuje ono kilka linii[Author ID2: at Fri Nov 2 11:41:00 2001 ]wierszy[Author ID2: at Fri Nov 2 11:41:00 2001 ], a jednak jest [Author ID2: at Fri Nov 2 12:40:00 2001 ]uważane jest [Author ID2: at Fri Nov 2 12:40:00 2001 ]za pojedyncze polecenie. Do wprowadzania takich poleceń, powłoka dostarcza specjalnego znaku zachęty (zwanego czasami drugim znakiem zachęty) po wprowadzeniu każdej [Author ID2: at Fri Nov 2 11:41:00 2001 ]każdego [Author ID2: at Fri Nov 2 11:41:00 2001 ]linii[Author ID2: at Fri Nov 2 11:41:00 2001 ]wiersza[Author ID2: at Fri Nov 2 11:41:00 2001 ]. Często skrypty są tworzone przy [Author ID2: at Fri Nov 2 11:42:00 2001 ]za [Author ID2: at Fri Nov 2 11:42:00 2001 ]pomocy [Author ID2: at Fri Nov 2 11:42:00 2001 ]pomocą [Author ID2: at Fri Nov 2 11:42:00 2001 ]edytorów tekstowych, wtedy nie są widoczne dodatkowe znaki zachęty powłoki.

Dla przykładu spróbujmy usunąć plik1,[Author ID2: at Fri Nov 2 11:42:00 2001 ] jeśli jest on starszy niż plik2. Poniższa komenda[Author ID2: at Fri Nov 2 11:42:00 2001 ]e plecenie[Author ID2: at Fri Nov 2 11:42:00 2001 ] powinna[Author ID2: at Fri Nov 2 11:42:00 2001 ]o[Author ID2: at Fri Nov 2 11:42:00 2001 ] poprawnie rozwiązywać to zadanie:

if test plik1 -ot plik2

then

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] rm plik1

fi

Polecenie to[Author ID2: at Fri Nov 2 11:42:00 2001 ] możesz dołączyć do skryptu, który akceptuje argumenty określające nazwy plików:

if test $1 -ot $2

then

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] rm $1

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] echo Usunięto stary plik

fi

Możesz zapisać powyższe [Author ID2: at Fri Nov 2 11:42:00 2001 ]polecenie do pliku o dowolnej nazwie np.:[Author ID2: at Fri Nov 2 11:42:00 2001 ] usuwacz i wykonać go:

./usuwacz plik1 plik2

A skrypt usunie plik1,[Author ID2: at Fri Nov 2 11:43:00 2001 ] jeśli jest on starszy od pliku2.[Author ID2: at Fri Nov 2 12:41:00 2001 ]

Komenda [Author ID2: at Fri Nov 2 12:42:00 2001 ]Polecenie [Author ID2: at Fri Nov 2 12:42:00 2001 ]case

Polecenie case dostarcza bardziej wyrafinowanej metody przetwarzania warunkowego:

case val[Author ID2: at Fri Nov 2 11:43:00 2001 ]ue[Author ID2: at Fri Nov 2 11:43:00 2001 ]wartość[Author ID2: at Fri Nov 2 11:43:00 2001 ] in

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]pattern1[Author ID2: at Fri Nov 2 11:43:00 2001 ]wzorzec1[Author ID2: at Fri Nov 2 11:43:00 2001 ]) komendy [Author ID2: at Fri Nov 2 11:43:00 2001 ]polecenia [Author ID2: at Fri Nov 2 11:43:00 2001 ];;

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]pattern2[Author ID2: at Fri Nov 2 11:43:00 2001 ]wzorzec2[Author ID2: at Fri Nov 2 11:43:00 2001 ][Author ID2: at Fri Nov 2 11:43:00 2001 ]) komendy[Author ID2: at Fri Nov 2 11:43:00 2001 ] [Author ID2: at Fri Nov 2 11:43:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:43:00 2001 ] [Author ID2: at Fri Nov 2 11:43:00 2001 ];;

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]...

esac

Polecenie to[Author ID2: at Fri Nov 2 11:43:00 2001 ] przestępuje do przystępuje do wyszukiwania określonych wartości odpowiadających podanym wzorom (pattern1[Author ID2: at Fri Nov 2 11:44:00 2001 ]wzorzec1[Author ID2: at Fri Nov 2 11:44:00 2001 ], pattern2[Author ID2: at Fri Nov 2 11:44:00 2001 ]wz[Author ID2: at Fri Nov 2 11:44:00 2001 ]orzec2[Author ID2: at Fri Nov 2 11:44:00 2001 ]). Jeśli istnieje odpowiednik pierwszego wzoru, polecenie związane z nim zostanie wykonane. Wzory budowane są przy użyciu znaków i meta [Author ID2: at Fri Nov 2 11:44:00 2001 ]znaków, takich jak te używane do określania argumentów komend[Author ID2: at Fri Nov 2 11:44:00 2001 ]poleceń[Author ID2: at Fri Nov 2 11:44:00 2001 ]. Jako przykład, p[Author ID2: at Fri Nov 2 11:44:00 2001 ]P[Author ID2: at Fri Nov 2 11:44:00 2001 ]rzyjrzyjmy się poleceniu case, którego zadaniem jest zinterpretowanie wartości pierwszego argumentu skryptu:

case $1 in

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]-r) echo Wymuś usuwanie bez potwierdzania ;;

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]-i) echo Potwierdź przed usunięciem ;;

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] *) echo Nieznany argument ;; esac

Komenda [Author ID2: at Fri Nov 2 11:44:00 2001 ]Polecenie[Author ID2: at Fri Nov 2 11:44:00 2001 ] [Author ID2: at Fri Nov 2 11:44:00 2001 ]wyświetla wiadomość zależnie od wartości pierwszego argumentu skryptu. Dobrym ćwiczeniem jest dołączenie do tego przykładu końcowego wzoru, który odpowiadałby każdej wartości argumentu skryptu.

Komenda [Author ID2: at Fri Nov 2 11:44:00 2001 ]Polecenie [Author ID2: at Fri Nov 2 11:44:00 2001 ]while

Komenda ta p[Author ID2: at Fri Nov 2 11:45:00 2001 ]P[Author ID2: at Fri Nov 2 11:45:00 2001 ]ozwala ono [Author ID2: at Fri Nov 2 11:45:00 2001 ]na wykonywanie serii poleceń iteracyjnie, to znaczy wielokrotnie, dopóki sprawdzane warunki będą prawdziwe:

while komenda[Author ID2: at Fri Nov 2 11:45:00 2001 ]polecenie[Author ID2: at Fri Nov 2 11:45:00 2001 ]

do

komendy[Author ID2: at Fri Nov 2 11:45:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:45:00 2001 ]

done

Oto skrypt, który używa polecenia while do wyświetlania własnych argumentów w kolejnych liniach[Author ID2: at Fri Nov 2 11:45:00 2001 ]wierszach[Author ID2: at Fri Nov 2 11:45:00 2001 ]:

echo $1

while shift 2>/dev/null

do

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] echo $1

done

Część polecenia while obejmująca pętlę do[Author ID2: at Wed Nov 7 12:24:00 2001 ] może także zawierać polecenia if, case [Author ID2: at Fri Nov 2 11:45:00 2001 ][Author ID2: at Fri Nov 2 11:45:00 2001 ] a nawet kolejne polecenie[Author ID2: at Fri Nov 2 11:45:00 2001 ] [Author ID2: at Fri Nov 2 11:46:00 2001 ]ą[Author ID2: at Fri Nov 2 11:45:00 2001 ] komendę[Author ID2: at Fri Nov 2 11:45:00 2001 ] while. Jednakże w tym ostatnim przypadku, skrypt taki robi się szybko nieczytelny. Powinieneś stosować komendy [Author ID2: at Fri Nov 2 11:46:00 2001 ]polecenia [Author ID2: at Fri Nov 2 11:46:00 2001 ]warunkowe razem[Author ID2: at Wed Nov 7 12:25:00 2001 ] tylko dla osiągnięcia jasnych wyników. Możesz dołączać komentarze wszędzie tam,[Author ID2: at Fri Nov 2 11:46:00 2001 ] gdzie wstawiasz zawikłane konstrukcje warunkowe.

Komenda [Author ID2: at Fri Nov 2 11:46:00 2001 ]Polecenie [Author ID2: at Fri Nov 2 11:46:00 2001 ]until

Polecenie to [Author ID2: at Fri Nov 2 11:46:00 2001 ]działa na niemalże identycznej zasadzie jak while, z jednym tylko wyjątkiem[Author ID2: at Wed Nov 7 12:25:00 2001 ]:[Author ID2: at Wed Nov 7 12:25:00 2001 ] pozwala mianowicie wykonywać serie komend [Author ID2: at Fri Nov 2 11:49:00 2001 ]poleceń [Author ID2: at Fri Nov 2 11:49:00 2001 ]iteracyjnie,[Author ID2: at Fri Nov 2 11:49:00 2001 ] dopóki sprawdzane warunki są fałszywe.

until komenda[Author ID2: at Fri Nov 2 11:50:00 2001 ]polecenie[Author ID2: at Fri Nov 2 11:50:00 2001 ]

do

komendy[Author ID2: at Fri Nov 2 11:50:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:50:00 2001 ]

done

Poniżej przedstawiam[Author ID2: at Fri Nov 2 11:50:00 2001 ]Spójrz[Author ID2: at Fri Nov 2 11:50:00 2001 ] na [Author ID2: at Wed Nov 7 12:25:00 2001 ]skrypt, który używa komendy [Author ID2: at Fri Nov 2 11:50:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:50:00 2001 ] [Author ID2: at Fri Nov 2 11:50:00 2001 ]until do wyświetlania własnych argumentów w kolejnych liniach[Author ID2: at Fri Nov 2 11:50:00 2001 ]wierszach[Author ID2: at Fri Nov 2 11:50:00 2001 ], aż nie pojawi się argument o wartości czarny[Author ID2: at Fri Nov 2 11:50:00 2001 ]:

until test $1 = "czarny"

do

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] echo $1

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] shift

done

Jeśli zapiszemy ten skrypt do pliku o nazwie kolorki w katalogu roboczym,[Author ID2: at Fri Nov 2 12:43:00 2001 ] to polecenie:

./kolorki zielony niebieski żółty czarny czerwony

wyświetli nam taki oto wynik:

zielony

niebieski

żółty

Polecenie for

Komenda ta[Author ID2: at Fri Nov 2 11:51:00 2001 ]Polecenie[Author ID2: at Fri Nov 2 11:51:00 2001 ] iteruje (powtarza, zapętlą[Author ID2: at Fri Nov 2 11:51:00 2001 ]zapętla[Author ID2: at Fri Nov 2 11:51:00 2001 ]) elementy określonej listy:

for variable[Author ID2: at Fri Nov 2 11:51:00 2001 ] [Author ID2: at Fri Nov 2 11:51:00 2001 ]zmienna[Author ID2: at Fri Nov 2 11:51:00 2001 ][Author ID2: at Fri Nov 2 11:52:00 2001 ] [Author ID2: at Fri Nov 2 11:51:00 2001 ]in list[Author ID2: at Fri Nov 2 11:51:00 2001 ] [Author ID2: at Fri Nov 2 11:51:00 2001 ]lista[Author ID2: at Fri Nov 2 11:51:00 2001 ] [Author ID2: at Fri Nov 2 11:51:00 2001 ](zmienn[Author ID2: at Fri Nov 2 11:51:00 2001 ]a z listy)[Author ID2: at Fri Nov 2 11:51:00 2001 ][Author ID2: at Fri Nov 2 11:51:00 2001 ]

[Author ID2: at Fri Nov 2 11:51:00 2001 ]

do

komendy[Author ID2: at Fri Nov 2 11:51:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:51:00 2001 ]

done

Za pomocą komend[Author ID2: at Fri Nov 2 11:51:00 2001 ]poleceń[Author ID2: at Fri Nov 2 11:51:00 2001 ],[Author ID2: at Fri Nov 2 11:51:00 2001 ] możesz odwołać się do aktualnego elementu listy poprzez zmienną powłoki $variable[Author ID2: at Fri Nov 2 11:51:00 2001 ]zmienna[Author ID2: at Fri Nov 2 11:51:00 2001 ], gdzie [Author ID2: at Fri Nov 2 11:53:00 2001 ]variable[Author ID2: at Fri Nov 2 11:52:00 2001 ] [Author ID2: at Fri Nov 2 11:52:00 2001 ]jest nazwą zmiennej wprowadzaną za poleceniem [Author ID2: at Fri Nov 2 11:53:00 2001 ]for[Author ID2: at Fri Nov 2 11:53:00 2001 ]. Lista zazwyczaj przyjmuje formę serii argumentów, które mogą zawierać meta [Author ID2: at Fri Nov 2 11:53:00 2001 ]znaki. Rozważmy na przykład taką instrukcję:

for i in 2 4 6 8

do

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] echo $i

done

Wyświetla ona wartości 2 4 6 8 w kolejnych liniach[Author ID2: at Fri Nov 2 11:53:00 2001 ]wierszach[Author ID2: at Fri Nov 2 11:53:00 2001 ].

Specjalna forma tego polecenia iteruje argumenty dowolnego skryptu:

for zmienna[Author ID2: at Fri Nov 2 11:53:00 2001 ]variable[Author ID2: at Fri Nov 2 11:53:00 2001 ] [Author ID2: at Fri Nov 2 11:53:00 2001 ](zmienna)[Author ID2: at Fri Nov 2 11:53:00 2001 ]

do

komendy[Author ID2: at Fri Nov 2 11:53:00 2001 ]polecenia[Author ID2: at Fri Nov 2 11:53:00 2001 ]

done

Na przykład, poniższy[Author ID2: at Fri Nov 2 12:44:00 2001 ] następny[Author ID2: at Fri Nov 2 12:44:00 2001 ] skrypt wyświetla własne argumenty w kolejnych wierszach:

for i

do

[Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] echo $i

done

Komendy [Author ID2: at Fri Nov 2 11:53:00 2001 ]Polecenia [Author ID2: at Fri Nov 2 11:53:00 2001 ]break oraz continue

Polecenia te s[Author ID2: at Fri Nov 2 11:54:00 2001 ]S[Author ID2: at Fri Nov 2 11:54:00 2001 ]ą to [Author ID2: at Fri Nov 2 11:54:00 2001 ]prostymi komendami, które[Author ID2: at Fri Nov 2 11:54:00 2001 ]pros[Author ID2: at Fri Nov 2 11:54:00 2001 ]te polecenia i[Author ID2: at Fri Nov 2 11:54:00 2001 ] nie przyjmują żadnych argumentów. Kiedy powłoka dostrzeże polecenie break, natychmiast wychodzi z pętli (while, until, [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]for). Kiedy natomiast powłoka zobaczy [Author ID2: at Fri Nov 2 12:01:00 2001 ]napotka [Author ID2: at Fri Nov 2 12:01:00 2001 ]polecenie continue, natychmiast przerywa aktualną iterację pętli. Jeśli warunki pętli na to pozwalają, wykonane mogą zostać inne powtórzenia pętli; w przeciwnym wypadku [Author ID2: at Fri Nov 2 12:02:00 2001 ]razie [Author ID2: at Fri Nov 2 12:02:00 2001 ]następuje wyjście z pętli.

Peryskop: użyteczny skrypt sieciowy

Załóżmy, że posiadasz darmowe konto e-[Author ID2: at Fri Nov 2 12:44:00 2001 ]mail, na przykład w Yahoo. Jesteś akurat w podróży i posiadasz jedynie zdalny dostęp do sieci Internet. Jednakże nie jesteś w stanie wykonywać żadnych operacji na plikach znajdujących się na komputerze domowym, ani też odebrać poczty, która tam przyszła. To typowe okoliczności, zwłaszcza jeśli jesteś w podróży (wymaga tego na przykład Twoja [Author ID2: at Fri Nov 2 12:02:00 2001 ]twoja [Author ID2: at Fri Nov 2 12:02:00 2001 ]praca).

Jeśli posiadasz w domu komputer działający pod kontrolą systemu Microsoft Windows, no to nie masz za dużo szczęścia. Jeśli nie zakupisz odpowiedniego oprogramowania, bardzo ciężko Ci [Author ID2: at Sun Nov 4 19:07:00 2001 ]ci [Author ID2: at Sun Nov 4 19:07:00 2001 ]będzie uzyskać dostęp do znajdujących się tam plików i poczty. Jednakże,[Author ID2: at Fri Nov 2 12:02:00 2001 ] jeśli to Linux jest systemem operacyjnym tego komputera, to nie będzie żadnych problemów.

W celu przedstawienia możliwości powłoki,[Author ID2: at Wed Nov 7 12:26:00 2001 ] w t[Author ID2: at Wed Nov 7 12:26:00 2001 ]ej podsekcji[Author ID2: at Fri Nov 2 12:02:00 2001 ]podrozdziale[Author ID2: at Fri Nov 2 12:45:00 2001 ] tym [Author ID2: at Wed Nov 7 12:26:00 2001 ]opisano bardziej złożony skrypt zwany peryskopem. Jest to program, który w określonym czasie każdego dnia ustanawia połączenie z Internetem.[Author ID2: at Wed Nov 7 12:27:00 2001 ] dla komputera w domu[Author ID2: at Wed Nov 7 12:27:00 2001 ] (który musisz zostawić włączony)[Author ID2: at Sun Nov 4 19:12:00 2001 ]. [Author ID2: at Wed Nov 7 12:27:00 2001 ]Takie połączenie z Internetem (lub z [Author ID2: at Wed Nov 7 12:27:00 2001 ]Dostawcą U[Author ID2: at Fri Nov 2 12:03:00 2001 ]sług [Author ID2: at Wed Nov 7 12:27:00 2001 ]Internetowych[Author ID2: at Fri Nov 2 12:03:00 2001 ]) [Author ID2: at Wed Nov 7 12:27:00 2001 ]za pomocą sesji PPP może być utrzymywane przez godzinę lub więcej, zależy,[Author ID2: at Fri Nov 2 12:03:00 2001 ] ile czasu potrzebujesz na połączenie się z Internetem z miejsca,[Author ID2: at Fri Nov 2 12:03:00 2001 ] w którym się znajdujesz, i wykonanie wszystkich żądanych operacji. Kiedy już się połączysz, możesz ściągnąć [Author ID2: at Fri Nov 2 12:03:00 2001 ]pobrać [Author ID2: at Fri Nov 2 12:03:00 2001 ]do siebie [Author ID2: at Fri Nov 2 12:03:00 2001 ]pocztę,[Author ID2: at Fri Nov 2 12:03:00 2001 ] lub przejrzeć ją zdalnie i wykonać inne zadania. Po upływie ustalonego czasu, program peryskop przerywa połączenie PPP, które zostanie nawiązane ponownie następnego dnia o tej samej porze.

Przykład 13.1 przedstawia zawartość pliku peryskop, który,[Author ID2: at Fri Nov 2 12:04:00 2001 ] jak widzisz,[Author ID2: at Fri Nov 2 12:04:00 2001 ] jest zdecydowanie dłuższy i bardziej złożony niż jakikolwiek skrypt opisywany w tym rozdziale. W związku z tym wyjaśnimy działanie skryptu linijka [Author ID2: at Fri Nov 2 12:04:00 2001 ]wiersz [Author ID2: at Fri Nov 2 12:04:00 2001 ]po linijce[Author ID2: at Fri Nov 2 12:04:00 2001 ]wierszu[Author ID2: at Fri Nov 2 12:04:00 2001 ]. Jak zobaczysz, skrypt ten ma bardzo prostą i przejrzystą budowę a w ogóle to nie jest aż taki sko[Author ID2: at Fri Nov 2 12:04:00 2001 ]mplikowany[Author ID2: at Fri Nov 2 12:04:00 2001 ].

Przykład 13.1. Peryskop

PATH=${PATH}:/usr/local/bin

route del default

wvdial &

sleep 1m

ifconfig | mail userid@mail.com

sleep 1h

killall wdial

sleep 2s

killall -9 wvdial

killall pppd

sleep 2s

killall -9 pppd

echo "/root/peryskop" [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]| at 10:00

P[Author ID2: at Fri Nov 2 12:04:00 2001 ]ierwsza [Author ID2: at Fri Nov 2 12:04:00 2001 ]Pierwszy [Author ID2: at Fri Nov 2 12:04:00 2001 ]linia [Author ID2: at Fri Nov 2 12:04:00 2001 ]wiersz [Author ID2: at Fri Nov 2 12:04:00 2001 ]określa ścieżkę poszukiwań dla skryptu, która ustawia katalog /usr/local/bin zawierający polecenie zewnętrzne powłoki wvdial. Niektóre skrypty startowe systemu Linux mogą nie zawierać tej ścieżki, więc bezpośrednie umieszczenie jej w tym programie zapobiegnie powstawaniu błędów na samym jego starcie.

PATH=${PATH}:/usr/local/bin

Następna lini[Author ID2: at Fri Nov 2 12:05:00 2001 ]y wiersz[Author ID2: at Fri Nov 2 12:05:00 2001 ]a[Author ID2: at Fri Nov 2 12:05:00 2001 ] jest prawdopodobnie najbardziej skomplikowany[Author ID2: at Fri Nov 2 12:05:00 2001 ]a[Author ID2: at Fri Nov 2 12:05:00 2001 ]:

route del default

Polecenie route jest zazwyczaj stosowane przez administratora systemu. Prawdopodobnie nie używałeś nigdy tego polecenia, ponieważ program konfigurujący sieć robił to za Ciebie[Author ID2: at Fri Nov 2 12:05:00 2001 ]ciebie[Author ID2: at Fri Nov 2 12:05:00 2001 ]. Efektem tego polecenie jest usunięcie domyślnej trasy sieciowej, jeśli taka istnieje. Domyślna trasa jest to taka droga wysyłanych pakietów TCP/IP, która nie zawiera informacji o trasie do określonych miejsc przeznaczenia tych pakietów. Należy ją usunąć z tego względu, że program wvdial, którego skrypt używa do nawiązania sesji PPP, jej nie zmieni,[Author ID2: at Wed Nov 7 12:28:00 2001 ] ani też nie usunie.

wvdial &

Powyższa [Author ID2: at Fri Nov 2 12:05:00 2001 ]Powyższy [Author ID2: at Fri Nov 2 12:05:00 2001 ]linia [Author ID2: at Fri Nov 2 12:05:00 2001 ]wiersz [Author ID2: at Fri Nov 2 12:05:00 2001 ]uruchamia program wvdial w tle (co określa znak &), tak że skrypt może dalej działać (tzn. wykonywać inne działania). Następny[Author ID2: at Fri Nov 2 12:05:00 2001 ]a[Author ID2: at Fri Nov 2 12:05:00 2001 ] linia [Author ID2: at Fri Nov 2 12:05:00 2001 ]wiersz [Author ID2: at Fri Nov 2 12:05:00 2001 ]zatrzymuje działanie skryptu na jedną minuta[Author ID2: at Sun Nov 4 19:08:00 2001 ]minutę[Author ID2: at Sun Nov 4 19:08:00 2001 ],[Author ID2: at Wed Nov 7 12:28:00 2001 ] po to,[Author ID2: at Wed Nov 7 12:28:00 2001 ] aby wvdial nawiązał połączenie PPP.

sleep 1m

Kolejna linia[Author ID2: at Fri Nov 2 12:06:00 2001 ]Kolejny wiersz[Author ID2: at Fri Nov 2 12:06:00 2001 ] uruchamia polecenie ifconfig i wysyła wiadomość e-[Author ID2: at Fri Nov 2 12:45:00 2001 ]mail do określonego użytkownika zawierającą wyjście tego programu (należy przy tym zastąpić userid@mail.com adresem [Author ID2: at Fri Nov 2 12:06:00 2001 ]własnym poczty [Author ID2: at Fri Nov 2 12:06:00 2001 ]adresem [Author ID2: at Fri Nov 2 12:06:00 2001 ]e-[Author ID2: at Sun Nov 4 19:08:00 2001 ]mail).

ifconfig [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]| userid@mail.com

Polecenie ifconfig produkuje [Author ID2: at Wed Nov 7 12:28:00 2001 ]wyjście, które wygląda mniej więcej tak:

ppp0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]Link encap:Point-Point Protocol

inet addr: 10.144.153.105 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]P-t-P: 10.144.153.52 Mask: 255.255.255.0

UP POINTOPOINT RUNNING MTU: 552 METRIC: 1

RX packets: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] errors: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] dropped: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] overruns: 0

TX packets: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] errors: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] dropped: 0 [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ] overruns: 0

Zobaczysz pewnie inne sekcje opisujące interfejs Ethernet (eth0) oraz urządzenie zwrotne lo. Zmienna inet addr mająca [Author ID2: at Wed Nov 7 12:29:00 2001 ]o [Author ID2: at Wed Nov 7 12:29:00 2001 ]wartość [Author ID2: at Wed Nov 7 12:29:00 2001 ]wartości [Author ID2: at Wed Nov 7 12:29:00 2001 ]10.144.153.105 oznacza adres IP Twojego [Author ID2: at Fri Nov 2 12:06:00 2001 ]twojego [Author ID2: at Fri Nov 2 12:06:00 2001 ]komputera. Wysyłając e-[Author ID2: at Fri Nov 2 12:46:00 2001 ]mail zawierający wyjście komendy [Author ID2: at Fri Nov 2 12:06:00 2001 ]polecenia [Author ID2: at Fri Nov 2 12:06:00 2001 ]ifconfig otrzymujesz informacje o adresie IP komputera domowego, który jest zmieniany za każdym razem,[Author ID2: at Fri Nov 2 12:06:00 2001 ] kiedy łączysz się z Internetem przy użyciu usługi PPP.

Kolejny wiersz powoduje zatrzymanie działania [Author ID2: at Sun Nov 4 19:09:00 2001 ]działanie [Author ID2: at Sun Nov 4 19:09:00 2001 ]skryptu na jedną godzinę.

sleep 1h

Oczywiście nie musi to być jedna godzina, możesz ustawić dowolną ilość czasu[Author ID2: at Fri Nov 2 12:07:00 2001 ]y czas[Author ID2: at Fri Nov 2 12:07:00 2001 ].

Kiedy już zostanie przekroczony czas pauzy programu, zaczyna on zamykać wszystkie uruchomione zadania programu wvdial:

killall wvdial

Uwaga

Dodatek E.[Author ID2: at Fri Nov 2 12:07:00 2001 ] „Krótki podręcznik komend [Author ID2: at Fri Nov 2 12:07:00 2001 ]poleceń [Author ID2: at Fri Nov 2 12:07:00 2001 ]Linuksa” dokładnie opisuje komendę [Author ID2: at Fri Nov 2 12:07:00 2001 ]polecenie [Author ID2: at Fri Nov 2 12:07:00 2001 ]killall i inne nieznane polecenia[Author ID2: at Fri Nov 2 12:07:00 2001 ]komendy[Author ID2: at Fri Nov 2 12:07:00 2001 ] zawarte w tym skrypcie.

Następnie skrypt zatrzymuje się na dwie sekundy po to,[Author ID2: at Fri Nov 2 12:07:00 2001 ] aby program wvdial zakończył poprawnie [Author ID2: at Wed Nov 7 12:29:00 2001 ]wszystkie swoje [Author ID2: at Wed Nov 7 12:29:00 2001 ]operacje poprawnie[Author ID2: at Wed Nov 7 12:29:00 2001 ].

sleep 2s

W niektórych przypadkach, program może zignorować żądanie przerwania działania. Poniższa linia[Author ID2: at Fri Nov 2 12:08:00 2001 ]y wiersz[Author ID2: at Fri Nov 2 12:08:00 2001 ],[Author ID2: at Fri Nov 2 12:08:00 2001 ] zapewnia jednak natychmiastowe zamknięcie programu wvdial,[Author ID2: at Fri Nov 2 12:08:00 2001 ],[Author ID2: at Fri Nov 2 12:08:00 2001 ] bez względu na okoliczności,[Author ID2: at Fri Nov 2 12:08:00 2001 ] wysyłając specjalny sygnał, który kończy [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]aktywny proces bezwarunkowo.

killall -9 wvdial

Wiadomo, że w tle program wvdial uruchamia także program pppd, który nawiązuje i zarządza połączeniem PPP. Kolejna [Author ID2: at Fri Nov 2 12:08:00 2001 ]Kolejne [Author ID2: at Fri Nov 2 12:08:00 2001 ]komenda [Author ID2: at Fri Nov 2 12:08:00 2001 ]polecenie [Author ID2: at Fri Nov 2 12:08:00 2001 ]killall zostaje wydana w celu przerwania połączenia i zamknięcia programu pppd, jeśli program wvdial tego nie zrobił:

killall pppd

Na końcu, skrypt korzysta z polecenia at,[Author ID2: at Fri Nov 2 12:09:00 2001 ] aby wyznaczyć następną datę swojego uruchomienia (domyślnie jest jutro):

echo "/root/peryskop" [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]| [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]at 10:00

Komenda [Author ID2: at Fri Nov 2 12:09:00 2001 ]Polecenie [Author ID2: at Fri Nov 2 12:09:00 2001 ]at odczytuje ze standardowego wejścia komendę [Author ID2: at Fri Nov 2 12:09:00 2001 ]polecenie [Author ID2: at Fri Nov 2 12:09:00 2001 ]echo (a dokładnie jej wyjście: /root/peryskop) i wykonuje je w określonym czasie (10:00).

Aby wypróbować skrypt,[Author ID2: at Fri Nov 2 12:09:00 2001 ] musisz zainstalować program wvdial; jego instalację i konfigurację przedstawiono w rozdziale 11. „Podłączanie do sieci Internet[Author ID2: at Fri Nov 2 12:10:00 2001 ]Łączenie z siecią Internet[Author ID2: at Fri Nov 2 12:10:00 2001 ]”. Umieść skrypt w katalogu /root pod nazwą peryskop. Jeśli chcesz wprowadzić jakieś zmiany (np. czasu rozpoczęcia lub trwania połączenia),[Author ID2: at Fri Nov 2 12:10:00 2001 ] otwórz te[Author ID2: at Wed Nov 7 12:30:00 2001 ]n [Author ID2: at Wed Nov 7 12:30:00 2001 ]skrypt w dowolnym edytorze i dokonaj odpowiednich poprawek. Aby uruchomić program,[Author ID2: at Fri Nov 2 12:10:00 2001 ] zaloguj się na użytkownika root i wydaj polecenie:

(echo "/root/peryskop" [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]| [Author ID2: at Fri Nov 2 12:48:00 2001 ] [Author ID2: at Fri Nov 2 12:48:00 2001 ]at 10:00) &

Kiedy wybije godzina 10:00 (lub ta którą ustawiłeś), system Linux powinien rozpocząć nawiązywanie połączenia z ISP i utrzymywać je przez określony przedział [Author ID2: at Wed Nov 7 12:30:00 2001 ]czasu[Author ID2: at Wed Nov 7 12:30:00 2001 ].

Używanie peryskopu

Kiedy nadejdzie określony czas,[Author ID2: at Fri Nov 2 12:10:00 2001 ] uruchom komputer i połącz się ze swoim kontem poczty. Powinieneś znaleźć wiadomość [Author ID2: at Wed Nov 7 12:30:00 2001 ]zawierającą wyjście programu ifconfig wraz z adresem IP komputera domowego. Teraz możesz użyć programu telnet lub ssh — wybór zależy od tego,[Author ID2: at Fri Nov 2 12:10:00 2001 ] jaki serwer z tych dwóch[Author ID2: at Wed Nov 7 12:31:00 2001 ]który serwer[Author ID2: at Wed Nov 7 12:31:00 2001 ] masz uruchomiony na komputerze domowym — aby połączyć się ze swoim komputerem i pracować przez wyznaczoną [Author ID2: at Wed Nov 7 12:31:00 2001 ]wyznacz[Author ID2: at Wed Nov 7 12:31:00 2001 ]ony [Author ID2: at Wed Nov 7 12:31:00 2001 ]ilość [Author ID2: at Wed Nov 7 12:31:00 2001 ]czasu[Author ID2: at Wed Nov 7 12:31:00 2001 ]. Pod koniec wyznaczonego czasu,[Author ID2: at Fri Nov 2 12:10:00 2001 ] system Linux rozpocznie rozłączanie i ustali datę i czas kolejnego połączenia.

Co dalej?[Author ID2: at Fri Nov 2 12:10:00 2001 ]

Jak łatwo zauważyć, peryskop nie jest bardzo skomplikowanym skryptem przez co nie odzwierciedla pełnych możliwości systemu Linux. Na przykład,[Author ID2: at Fri Nov 2 12:11:00 2001 ] załóżmy, że chciałbyś ustanowić połączenie o różnych porach dnia lub różnych dniach tygodnia.[Author ID2: at Fri Nov 2 12:11:00 2001 ] a[Author ID2: at Fri Nov 2 12:11:00 2001 ]A[Author ID2: at Fri Nov 2 12:11:00 2001 ]lbo chciałbyś ustalić pewien harmonogram połączeń za każdym razem,[Author ID2: at Fri Nov 2 12:11:00 2001 ] kiedy się logujesz.

Linux jest w stanie sprostać takim wymaganiom na różne sposoby. Na przykład program cron, który jest trochę bardziej zaawansowany niż at, umożliwia bardzo elastyczne określanie czasu uruchomienia programów. Pozwala on między innymi ustanowić połączenie o określonej porze w każdy trzeci piątek miesiąca.

Więcej na temat Linuksa dowiesz się po przeczytaniu Dodatku [Author ID2: at Fri Nov 2 12:11:00 2001 ]dodatku [Author ID2: at Fri Nov 2 12:11:00 2001 ]E.[Author ID2: at Fri Nov 2 12:11:00 2001 ] „Krótki podręcznik komend [Author ID2: at Fri Nov 2 12:12:00 2001 ]poleceń [Author ID2: at Fri Nov 2 12:12:00 2001 ]Linuksa”, w którym opisano wiele pożytecznych komend [Author ID2: at Fri Nov 2 12:12:00 2001 ]poleceń [Author ID2: at Fri Nov 2 12:12:00 2001 ]systemu Linux, które możesz użyć w skryptach. Najlepszą metodą poznania tych poleceń jest dokładne przeczytanie tego rozdziału i wypróbowanie znajdujących się tam komend[Author ID2: at Fri Nov 2 12:12:00 2001 ]. Należy także przynajmniej zajrzeć do ich stron podręczników, na pewno znajdziesz tam wiele interesujących informacji.

Jeśli złapałeś linuksowego [Author ID2: at Fri Nov 2 12:12:00 2001 ]bakcyla na, Linuksa[Author ID2: at Fri Nov 2 12:12:00 2001 ], co zdarzyło się wielu użytkownikom komputerów, polecam Ci [Author ID2: at Fri Nov 2 12:12:00 2001 ]ci [Author ID2: at Fri Nov 2 12:12:00 2001 ]inne książki o tym systemie:

Mnóstwo informacji na temat Linuksa znajdziesz na stronach WWW opisanych w rozdziale 1. „Dlaczego Linux?[Author ID2: at Fri Nov 2 12:13:00 2001 ]” oraz w czasopismach Linux Journal i Linux Magazine.

Jednakże, nie czytaj tylko o Linuksie, pracuj z nim. Pisz, testuj i debuguj własne skrypty. Dziel się napisanymi skryptami z innymi użytkownikami tego systemu oraz studiuj skrypty innych. Ponadto czytaj wiadomości grup dyskusyjnych[Author ID2: at Sun Nov 4 19:09:00 2001 ] i komunikuj się z innymi ludźmi; dziel się tym,[Author ID2: at Fri Nov 2 12:13:00 2001 ] co [Author ID2: at Fri Nov 2 12:13:00 2001 ]czego [Author ID2: at Fri Nov 2 12:13:00 2001 ]się dowiedziałeś i pytaj o to,[Author ID2: at Fri Nov 2 12:13:00 2001 ] co chcesz wiedzieć. Takie postępowanie stało się fundamentem kultury ludzi związanych z systemem Linux o czym[Author ID2: at Fri Nov 2 12:14:00 2001 ]Linux, o czym[Author ID2: at Fri Nov 2 12:14:00 2001 ] zapewne przekonasz się już sam.

2 Część I Podstawy obsługi systemu WhizBang (Nagłówek strony)

2 C:\hel\r13-05-w-trakcie.doc[Author ID3: at Tue Nov 13 18:01:00 2001 ]C:\!\r13-05-w-trakcie.doc[Author ID3: at Tue Nov 13 18:01:00 2001 ]

programu czy interfejsu? Bulba: może interfejsu graficznego danego programu do wykonywania

[Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ][Author ID2: at Sun Nov 4 18:59:00 2001 ]????????[Author ID2: at Sun Nov 4 18:59:00 2001 ] Bulba ja rozumiem. Chodzi o to że powłoka to nie tylko znak zachęty ale środowisko programistyczne.

[Author ID2: at Wed Nov 7 11:48:00 2001 ][Author ID2: at Wed Nov 7 11:48:00 2001 ][Author ID2: at Wed Nov 7 11:48:00 2001 ][Author ID2: at Wed Nov 7 11:48:00 2001 ][Author ID2: at Wed Nov 7 11:48:00 2001 ]????[Author ID2: at Wed Nov 7 11:48:00 2001 ] Bulba: jak najbardziej prawda.

[Author ID2: at Wed Nov 7 11:51:00 2001 ][Author ID2: at Wed Nov 7 11:51:00 2001 ][Author ID2: at Wed Nov 7 11:51:00 2001 ][Author ID2: at Wed Nov 7 11:51:00 2001 ][Author ID2: at Wed Nov 7 11:51:00 2001 ] Nie wiem, jak to inaczej powiedzieć[Author ID2: at Wed Nov 7 11:51:00 2001 ]

[Author ID2: at Wed Nov 7 11:52:00 2001 ][Author ID2: at Wed Nov 7 11:52:00 2001 ][Author ID2: at Wed Nov 7 11:52:00 2001 ][Author ID2: at Wed Nov 7 11:52:00 2001 ][Author ID2: at Wed Nov 7 11:52:00 2001 ] jaka jest różnica?[Author ID2: at Wed Nov 7 11:52:00 2001 ]

[Author ID2: at Wed Nov 7 11:53:00 2001 ][Author ID2: at Wed Nov 7 11:53:00 2001 ][Author ID2: at Wed Nov 7 11:53:00 2001 ][Author ID2: at Wed Nov 7 11:53:00 2001 ][Author ID2: at Wed Nov 7 11:53:00 2001 ]????[Author ID2: at Wed Nov 7 11:53:00 2001 ] Bulba: nast[Author ID3: at Tue Nov 13 11:59:00 2001 ]ę[Author ID3: at Tue Nov 13 12:00:00 2001 ]p[Author ID3: at Tue Nov 13 11:59:00 2001 ]nie wykonuje swoje zadanie uwzględniając podane parametry.[Author ID3: at Tue Nov 13 12:00:00 2001 ]

[Author ID2: at Fri Nov 2 08:55:00 2001 ][Author ID2: at Fri Nov 2 08:55:00 2001 ][Author ID2: at Fri Nov 2 08:55:00 2001 ][Author ID2: at Fri Nov 2 08:55:00 2001 ][Author ID2: at Fri Nov 2 08:55:00 2001 ] Na BOGA!!!!![Author ID2: at Fri Nov 2 08:55:00 2001 ] Bulba: [Author ID3: at Tue Nov 13 12:01:00 2001 ]nie będziesz brał imienia Pana Boga swego na [Author ID3: at Tue Nov 13 13:29:00 2001 ]daremno.[Author ID3: at Tue Nov 13 13:29:00 2001 ] Może lepiej by zabrzmiało "przetwarzanie wieloznaków[Author ID3: at Tue Nov 13 13:30:00 2001 ]"[Author ID3: at Tue Nov 13 13:31:00 2001 ] i tyle[Author ID3: at Tue Nov 13 13:30:00 2001 ]. W DOSie trudno mówić o metaznakach czy wyrażeniach regularnych[Author ID3: at Tue Nov 13 13:31:00 2001 ]

[Author ID2: at Wed Nov 7 11:55:00 2001 ][Author ID2: at Wed Nov 7 11:55:00 2001 ][Author ID2: at Wed Nov 7 11:55:00 2001 ][Author ID2: at Wed Nov 7 11:55:00 2001 ][Author ID2: at Wed Nov 7 11:55:00 2001 ]???[Author ID2: at Wed Nov 7 11:55:00 2001 ] Bulba: "poprawnej nazwy"[Author ID3: at Tue Nov 13 13:32:00 2001 ]

[Author ID2: at Wed Nov 7 11:58:00 2001 ][Author ID2: at Wed Nov 7 11:58:00 2001 ][Author ID2: at Wed Nov 7 11:58:00 2001 ][Author ID2: at Wed Nov 7 11:58:00 2001 ][Author ID2: at Wed Nov 7 11:58:00 2001 ]???[Author ID2: at Wed Nov 7 11:58:00 2001 ] Bulba: pomija znak nowego wiers[Author ID3: at Tue Nov 13 18:02:00 2001 ]za[Author ID3: at Tue Nov 13 18:02:00 2001 ]

chyba to się nazywa standardowe wyjście błędu? Dalej nie czytam. Bulba: w zasadzie tak ale to wyjscie de facto[Author ID3: at Tue Nov 13 18:02:00 2001 ] jest potokiem[Author ID3: at Tue Nov 13 18:03:00 2001 ]

[Author ID2: at Wed Nov 7 12:03:00 2001 ][Author ID2: at Wed Nov 7 12:03:00 2001 ][Author ID2: at Wed Nov 7 12:03:00 2001 ][Author ID2: at Wed Nov 7 12:03:00 2001 ][Author ID2: at Wed Nov 7 12:03:00 2001 ]????[Author ID2: at Wed Nov 7 12:03:00 2001 ] Bulba: raczej OK ja rozumiem. [Author ID3: at Tue Nov 13 18:03:00 2001 ]Można ew. zmienić na „Przekierowuje standardowe wyjście kmd1 i przekazuje na standardowe wejście kmd2[Author ID3: at Tue Nov 13 18:04:00 2001 ][Author ID3: at Tue Nov 13 18:05:00 2001 ]

[Author ID2: at Fri Nov 2 09:49:00 2001 ][Author ID2: at Fri Nov 2 09:49:00 2001 ][Author ID2: at Fri Nov 2 09:49:00 2001 ][Author ID2: at Fri Nov 2 09:49:00 2001 ][Author ID2: at Fri Nov 2 09:49:00 2001 ] merytoryczny[Author ID2: at Fri Nov 2 09:49:00 2001 ] Bulba: można drażliwych zmienić na denerwujących, drażniących. [Author ID3: at Tue Nov 13 18:05:00 2001 ]Prawda jest taka, że zazwyczaj przekierowuje się do dev/null-a aby nie wkur.......[Author ID3: at Tue Nov 13 18:06:00 2001 ]

[Author ID2: at Fri Nov 2 12:26:00 2001 ][Author ID2: at Fri Nov 2 12:26:00 2001 ][Author ID2: at Fri Nov 2 12:26:00 2001 ][Author ID2: at Fri Nov 2 12:26:00 2001 ][Author ID2: at Fri Nov 2 12:26:00 2001 ] czy mer. może mi wytłumaczyć, gdzie się tworzy ten pusty plik? A może chodzi o specjalny rodzaj urządzenia?[Author ID2: at Fri Nov 2 12:26:00 2001 ] Merytoryczny za cholere nie widzi w tym zdaniu słowa o tworzeniu!!!! A czy większość urządzeń nie jest reprpezentowana przez pliki. Sami twórcy jądra linuxa piszą o tego typu urządzeniach special FILE lub po[Author ID3: at Tue Nov 13 18:07:00 2001 ] [Author ID3: at Tue Nov 13 18:08:00 2001 ]prostu FILE.[Author ID3: at Tue Nov 13 18:07:00 2001 ] Z resztą[Author ID3: at Tue Nov 13 18:08:00 2001 ] nulla w 99% wykorzytuje się jako plik i podswiadomie się o nim myśli plik. [Author ID3: at Tue Nov 13 18:09:00 2001 ]Dodatkowo „urządzenie” to można czytać, pisać i szukać po nim jak po zwykłym pliku !!!. [Author ID3: at Tue Nov 13 18:10:00 2001 ]Niedowiarków odwoluje do źródeł linuxa zdjae się, do drivers/mem.c.[Author ID3: at Tue Nov 13 18:11:00 2001 ] Uważam, że pisanie o null-u jako o putym pliku zwłaszcza w książkach „dla każdego” uważam za najzupełniej słuszne.[Author ID3: at Tue Nov 13 18:12:00 2001 ]

[Author ID2: at Fri Nov 2 12:27:00 2001 ][Author ID2: at Fri Nov 2 12:27:00 2001 ][Author ID2: at Fri Nov 2 12:27:00 2001 ][Author ID2: at Fri Nov 2 12:27:00 2001 ][Author ID2: at Fri Nov 2 12:27:00 2001 ] Jakieś wyróżnienie?[Author ID2: at Fri Nov 2 12:27:00 2001 ]

[Author ID2: at Fri Nov 2 12:34:00 2001 ][Author ID2: at Fri Nov 2 12:34:00 2001 ][Author ID2: at Fri Nov 2 12:34:00 2001 ][Author ID2: at Fri Nov 2 12:34:00 2001 ][Author ID2: at Fri Nov 2 12:34:00 2001 ][Author ID2: at Fri Nov 2 12:34:00 2001 ] jakieś wyróznienie?[Author ID2: at Fri Nov 2 12:34:00 2001 ]

[Author ID2: at Fri Nov 2 10:31:00 2001 ][Author ID2: at Fri Nov 2 10:31:00 2001 ][Author ID2: at Fri Nov 2 10:31:00 2001 ][Author ID2: at Fri Nov 2 10:31:00 2001 ][Author ID2: at Fri Nov 2 10:31:00 2001 ]?[Author ID2: at Fri Nov 2 10:31:00 2001 ] Bulba dla mnie OK.[Author ID3: at Tue Nov 13 18:14:00 2001 ]

[Author ID2: at Fri Nov 2 10:40:00 2001 ][Author ID2: at Fri Nov 2 10:40:00 2001 ][Author ID2: at Fri Nov 2 10:40:00 2001 ][Author ID2: at Fri Nov 2 10:40:00 2001 ][Author ID2: at Fri Nov 2 10:40:00 2001 ] [Author ID2: at Fri Nov 2 10:40:00 2001 ]A[Author ID2: at Fri Nov 2 12:26:00 2001 ] co to?[Author ID2: at Fri Nov 2 10:40:00 2001 ]

[Author ID2: at Fri Nov 2 10:41:00 2001 ][Author ID2: at Fri Nov 2 10:41:00 2001 ][Author ID2: at Fri Nov 2 10:41:00 2001 ][Author ID2: at Fri Nov 2 10:41:00 2001 ][Author ID2: at Fri Nov 2 10:41:00 2001 ] [Author ID2: at Fri Nov 2 10:41:00 2001 ]Genialnie[Author ID2: at Fri Nov 2 12:26:00 2001 ]. [Author ID2: at Fri Nov 2 10:41:00 2001 ]Pytanie[Author ID2: at Fri Nov 2 12:26:00 2001 ] brzmi, gdzie jest cudzysłów?[Author ID2: at Fri Nov 2 10:41:00 2001 ] Bulba dokładnie 5 linijek wyżej. Jak się książkę sprawdza to trzeba wiedzieć i ROZUMIEĆ co w niej jest napisane.[Author ID3: at Tue Nov 13 18:15:00 2001 ]

[Author ID2: at Wed Nov 7 12:22:00 2001 ][Author ID2: at Wed Nov 7 12:22:00 2001 ][Author ID2: at Wed Nov 7 12:22:00 2001 ][Author ID2: at Wed Nov 7 12:22:00 2001 ][Author ID2: at Wed Nov 7 12:22:00 2001 ]???[Author ID2: at Wed Nov 7 12:22:00 2001 ] Bulba dla mnie OK. Jest to tabela w której zestawiono szablony tego co można wpisać po słowie test a więc formy jakie mogą wystąpić jako argumenty test[Author ID3: at Tue Nov 13 18:16:00 2001 ]-a[Author ID3: at Tue Nov 13 18:16:00 2001 ]

[Author ID2: at Fri Nov 2 11:38:00 2001 ][Author ID2: at Fri Nov 2 11:38:00 2001 ][Author ID2: at Fri Nov 2 11:38:00 2001 ][Author ID2: at Fri Nov 2 11:38:00 2001 ][Author ID2: at Fri Nov 2 11:38:00 2001 ] [Author ID2: at Fri Nov 2 11:38:00 2001 ]A[Author ID2: at Fri Nov 2 12:26:00 2001 ] nie suma?[Author ID2: at Fri Nov 2 11:38:00 2001 ] Bulba NIE, NIE i jeszcze raz nie !!!. [Author ID3: at Tue Nov 13 18:18:00 2001 ]Ja logikę aalgebrę Bool'a miałem na samym poczatku liceum ( ale to było przed reformą ) teraz należy chyba odesłać delikfenta do gimnazjum. [Author ID3: at Tue Nov 13 18:19:00 2001 ]Oczywiście, że nie sumy. Jedyne co to można wymienić na koniunkcji aby było napise w konwencji[Author ID3: at Tue Nov 13 18:20:00 2001 ] takiej jak ponizej[Author ID3: at Tue Nov 13 18:21:00 2001 ]

[Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ] jakieś wyróznienie?[Author ID2: at Fri Nov 2 12:38:00 2001 ]

[Author ID2: at Fri Nov 2 11:40:00 2001 ][Author ID2: at Fri Nov 2 11:40:00 2001 ][Author ID2: at Fri Nov 2 11:40:00 2001 ][Author ID2: at Fri Nov 2 11:40:00 2001 ][Author ID2: at Fri Nov 2 11:40:00 2001 ] [Author ID2: at Fri Nov 2 11:40:00 2001 ]Znów[Author ID2: at Fri Nov 2 12:26:00 2001 ] brak wyróżnień[Author ID2: at Fri Nov 2 11:40:00 2001 ]

[Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ][Author ID2: at Fri Nov 2 12:38:00 2001 ] podobnie[Author ID2: at Fri Nov 2 12:38:00 2001 ]

[Author ID2: at Fri Nov 2 12:41:00 2001 ][Author ID2: at Fri Nov 2 12:41:00 2001 ][Author ID2: at Fri Nov 2 12:41:00 2001 ][Author ID2: at Fri Nov 2 12:41:00 2001 ][Author ID2: at Fri Nov 2 12:41:00 2001 ] znów brak wyróżnień[Author ID2: at Fri Nov 2 12:41:00 2001 ]

[Author ID2: at Fri Nov 2 11:43:00 2001 ][Author ID2: at Fri Nov 2 11:43:00 2001 ][Author ID2: at Fri Nov 2 11:43:00 2001 ][Author ID2: at Fri Nov 2 11:43:00 2001 ][Author ID2: at Fri Nov 2 11:43:00 2001 ] [Author ID2: at Fri Nov 2 11:43:00 2001 ]Znów[Author ID2: at Fri Nov 2 12:26:00 2001 ] nie łaska było przetłumaczyć[Author ID2: at Fri Nov 2 11:43:00 2001 ]. Bulba ale co to jest po polsku. czy on chce tłumaczyc case na polski ???[Author ID3: at Tue Nov 13 18:23:00 2001 ]

[Author ID2: at Wed Nov 7 12:24:00 2001 ][Author ID2: at Wed Nov 7 12:24:00 2001 ][Author ID2: at Wed Nov 7 12:24:00 2001 ][Author ID2: at Wed Nov 7 12:24:00 2001 ][Author ID2: at Wed Nov 7 12:24:00 2001 ] wyr.[Author ID2: at Wed Nov 7 12:24:00 2001 ]

[Author ID2: at Wed Nov 7 12:25:00 2001 ][Author ID2: at Wed Nov 7 12:25:00 2001 ][Author ID2: at Wed Nov 7 12:25:00 2001 ][Author ID2: at Wed Nov 7 12:25:00 2001 ][Author ID2: at Wed Nov 7 12:25:00 2001 ]???[Author ID2: at Wed Nov 7 12:25:00 2001 ] [Author ID3: at Tue Nov 13 18:26:00 2001 ]Bulba [Author ID3: at Tue Nov 13 18:27:00 2001 ]Jest ok[Author ID3: at Tue Nov 13 18:26:00 2001 ] tylko zagmatwane. Chodzi o to, żeby nie wplątać się w nadmiar róznych poleceń warunkowych nad którymi starcimy kontrole ( kod sie robi starsznie pogmatwany )[Author ID3: at Tue Nov 13 18:27:00 2001 ]

[Author ID2: at Fri Nov 2 11:50:00 2001 ][Author ID2: at Fri Nov 2 11:50:00 2001 ][Author ID2: at Fri Nov 2 11:50:00 2001 ][Author ID2: at Fri Nov 2 11:50:00 2001 ][Author ID2: at Fri Nov 2 11:50:00 2001 ] [Author ID2: at Fri Nov 2 11:50:00 2001 ]Jakieś[Author ID2: at Fri Nov 2 12:26:00 2001 ] wyróżnienia?[Author ID2: at Fri Nov 2 11:50:00 2001 ]

[Author ID2: at Fri Nov 2 11:52:00 2001 ][Author ID2: at Fri Nov 2 11:52:00 2001 ][Author ID2: at Fri Nov 2 11:52:00 2001 ][Author ID2: at Fri Nov 2 11:52:00 2001 ][Author ID2: at Fri Nov 2 11:52:00 2001 ] [Author ID2: at Fri Nov 2 11:52:00 2001 ]A[Author ID2: at Fri Nov 2 12:26:00 2001 ] tu nie [Author ID2: at Fri Nov 2 11:52:00 2001 ]powinno[Author ID2: at Fri Nov 2 12:26:00 2001 ] być $zmienna?[Author ID2: at Fri Nov 2 11:52:00 2001 ]. B[Author ID3: at Tue Nov 13 18:29:00 2001 ]ulba: „nie tu powinno być jestem tempym jełopem i niewiele mi trzeba”. Oczywiście że jest dobrze.[Author ID3: at Tue Nov 13 18:30:00 2001 ]

[Author ID2: at Wed Nov 7 12:28:00 2001 ][Author ID2: at Wed Nov 7 12:28:00 2001 ][Author ID2: at Wed Nov 7 12:28:00 2001 ][Author ID2: at Wed Nov 7 12:28:00 2001 ][Author ID2: at Wed Nov 7 12:28:00 2001 ]???[Author ID2: at Wed Nov 7 12:28:00 2001 ]. Bulba może produkuje nie jest po polsku ?? [Author ID3: at Tue Nov 13 18:30:00 2001 ]Dla mnie jest OK.[Author ID3: at Tue Nov 13 18:31:00 2001 ]

[Author ID2: at Wed Nov 7 12:30:00 2001 ][Author ID2: at Wed Nov 7 12:30:00 2001 ][Author ID2: at Wed Nov 7 12:30:00 2001 ][Author ID2: at Wed Nov 7 12:30:00 2001 ][Author ID2: at Wed Nov 7 12:30:00 2001 ]????[Author ID2: at Wed Nov 7 12:30:00 2001 ] Bulba: jest ok ale tu jest opsiana p[Author ID3: at Tue Nov 13 18:31:00 2001 ]ewna barziej zlozona czynnosc i chyba JAZ-a przerosla.[Author ID3: at Tue Nov 13 18:31:00 2001 ] Po mojemy jest OK.[Author ID3: at Tue Nov 13 18:32:00 2001 ]



Wyszukiwarka

Podobne podstrony:
7795
7795
praca magisterska wa c 7795
7795
7795
7795
7795
7795
praca magisterska wa c 7795

więcej podobnych podstron