Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Skrypty powoki.
Od podstaw
Autorzy: Eric Foster-Johnson,
John C. Welch, Micah Anderson
Tumaczenie: Przemysaw Szeremiota
ISBN: 83-246-0209-7
Tytu oryginau: Beginning Shell Scripting
Format: B5, stron: 576

Wykorzystaj wszystkie moliwoci systemu operacyjnego


Poznaj rodzaje powok
Naucz si pisa skrypty i uywaj ich do rnych zada
Posuguj si skryptami do sterowania aplikacj
Mimo dynamicznego rozwoju graficznych systemw operacyjnych niektre
zadania mona wykonywa jedynie z poziomu konsoli tekstowej. Korzystajc z niej,
administrator precyzyjniej kontroluje dziaanie systemu, szybciej rozwizuje problemy
sprztowe i sprawniej optymalizuje standardowe procesy. Powoki i skrypty stanowi
odpowiednie narzdzia pracy dla dowiadczonych uytkownikw systemw
operacyjnych.
Ksika Skrypty powoki. Od podstaw przedstawia metody korzystania z powoki
tekstowej w rnych systemach operacyjnych Windows, Mac OS X, Linux i Unix.
Omawia zarwno proste, jak i zaawansowane skrypty oraz pokazuje moliwoci ich
zastosowania. Kade zagadnienie przedstawione jest na przykadzie, co uatwia
przyswajanie wiedzy. Ksika zawiera wszystkie wiadomoci o skryptach niezbdne
do samodzielnego ich tworzenia i wykorzystywania.
Powoki w rnych systemach operacyjnych
Narzdzia do edycji skryptw powoki
Stosowanie zmiennych
Operacje wejcia i wyjcia
Sterowanie dziaaniem skryptw
Interakcja skryptu z systemem operacyjnym
Przetwarzanie tekstw
Kontrolowanie procesw systemowych
Testowanie skryptw
Stosowanie skryptw w rodowiskach graficznych
Poznaj techniki, dziki ktrym wykorzystasz ca moc komputera

O autorach ...................................................................................................................................................11
Wprowadzenie ...........................................................................................................................................13
Rozdzia 1. Powoki wprowadzenie ......................................................................................................19
Czym jest powoka? ..................................................................................................... 20
Po co nam powoki? ..................................................................................................... 21
Rodzaje powok ............................................................................................................ 22
Powoka Bournea ................................................................................................... 23
Powoka C .............................................................................................................. 23
Powoka Korna ....................................................................................................... 24
Powoka bash ......................................................................................................... 25
Powoka T C ........................................................................................................... 26
Inne powoki ........................................................................................................... 26
Powoki graficzne .................................................................................................... 27
Oficjalna powoka POSIX .......................................................................................... 28
Powoki domylne ................................................................................................... 28
Wybr powoki ........................................................................................................ 29
Zmiana powoki domylnej ....................................................................................... 30
Uruchamianie powoki w powoce ............................................................................. 32
Wicej informacji o powoce ..................................................................................... 33
Powoki a rodowisko graficzne ..................................................................................... 33
Uruchamianie powoki w Linuksie ............................................................................. 35
Uruchamianie powoki w Mac OS X ........................................................................... 37
Uruchamianie powoki w systemach Unix .................................................................. 38
Uruchamianie powoki w Windows command.com to mao? ................................... 39
Uruchamianie powoki na urzdzeniach PDA i w innych systemach .............................. 40
Wprowadzanie polece ................................................................................................. 40
Jaka to powoka? .................................................................................................... 42
Opcje wywoania ..................................................................................................... 44
Edycja wiersza polecenia .............................................................................................. 48
Przywoywanie polece ............................................................................................ 49
Przegldanie historii polece ................................................................................... 53
Wywoywanie edytora wiersza polecenia .................................................................... 55
Uzupenianie nazw plikw ........................................................................................ 56
Symbole wieloznaczne .................................................................................................. 57
Symbol * ............................................................................................................... 57
Symbol ? ............................................................................................................... 59
Uruchamianie polece w tle .......................................................................................... 60
Podsumowanie ............................................................................................................ 60

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Skrypty powoki. Od podstaw


Rozdzia 2. Wprowadzenie do skryptw powoki .................................................................................. 63
Czym s skrypty powoki? ............................................................................................. 64
Alternatywne jzyki skryptowe ....................................................................................... 67
Perl ....................................................................................................................... 68
Python ................................................................................................................... 70
Tcl ......................................................................................................................... 71
Pliki wsadowe MS-DOS ............................................................................................ 72
Narzdzia edycji skryptw powoki ................................................................................. 72
Edytory tradycyjne ................................................................................................... 72
Edytory graficzne ..................................................................................................... 85
Pisanie skryptw .......................................................................................................... 93
Odcianie pamici skrypty wywoujce proste polecenia ....................................... 93
Wyprowadzanie tekstu ze skryptw ........................................................................... 95
Zmienne ................................................................................................................ 99
Pozyskiwanie danych z wejcia ............................................................................... 105
Komentarze w skryptach ....................................................................................... 107
amanie wierszy ................................................................................................... 110
Podsumowanie .......................................................................................................... 111
Zadania ..................................................................................................................... 112

Rozdzia 3. Sterowanie przebiegiem wykonywania skryptw ............................................................115


Odwoania do zmiennych ............................................................................................ 116
Ptle i iteracje ........................................................................................................... 120
Przegldanie listy plikw ........................................................................................ 121
Ptle o okrelonej liczbie iteracji ............................................................................ 124
Powoka bash ptle jak w jzyku C ..................................................................... 127
Ptle w powoce C ................................................................................................ 129
Ptle zagniedone ............................................................................................... 130
Instrukcje warunkowe jeli ...................................................................................... 131
A jeli nie? ........................................................................................................... 133
Czym jest prawda? ................................................................................................ 133
Przekierowywanie wyjcia ...................................................................................... 137
elif skrt od else if ........................................................................................... 143
Zagniedanie instrukcji if ........................................................................................... 145
Testowanie poleceniem test ....................................................................................... 146
Porwnywanie liczb ............................................................................................... 146
Porwnywanie cigw tekstowych ........................................................................... 149
Testowanie plikw ................................................................................................ 152
Operatory logiczne i operator negacji ...................................................................... 152
Skrcony zapis polecenia test ............................................................................... 155
Trudne decyzje a instrukcja wyboru .............................................................................. 157
Obsuga problematycznych danych wejciowych ....................................................... 159
Instrukcja wyboru w powoce C ............................................................................... 161
Ptla while powtarzanie pod warunkiem ................................................................... 163
Powtarzanie pod warunkiem ptla until .................................................................... 164
Podsumowanie .......................................................................................................... 166
Zadania ..................................................................................................................... 166

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Spis treci

Rozdzia 4. Interakcja ze rodowiskiem skryptu .................................................................................169


Zmienne rodowiskowe .............................................................................................. 169
Odczytywanie wartoci zmiennych rodowiskowych .................................................. 170
Ustawianie zmiennych rodowiskowych .................................................................. 184
Dostosowywanie wasnego konta ................................................................................ 187
Rozruch powoki Bournea ..................................................................................... 188
Rozruch powoki Korna .......................................................................................... 188
Rozruch powoki C ................................................................................................ 188
Rozruch powoki T C .............................................................................................. 189
Rozruch powoki bash ........................................................................................... 189
Obsuga argumentw wiersza polece ......................................................................... 190
Wczytywanie argumentw wywoania w powoce Bournea ........................................ 191
Wczytywanie argumentw wywoania w powoce C ................................................... 195
Usamodzielnianie skryptw powoki ............................................................................. 195
Nadawanie skryptowi atrybutu wykonywalnoci ........................................................ 195
Magiczny wiersz #! ................................................................................................ 196
Podsumowanie .......................................................................................................... 200
Zadania ..................................................................................................................... 200

Rozdzia 5. Praca z plikami .....................................................................................................................201


Tworzenie archiww plikw ......................................................................................... 202
Manipulowanie uprawnieniami .................................................................................... 203
Analizowanie atrybutw plikw poleceniem test ............................................................ 205
Pliki w systemie Mac OS X .......................................................................................... 207
Spucizna po NeXT ............................................................................................... 207
Mobilne systemy plikw w Mac OS X ...................................................................... 208
Nazewnictwo ........................................................................................................ 210
Odwieczna wojna w Mac OS X HFS+ kontra UFS ....................................................... 210
Pliki na widelcu ..................................................................................................... 211
Pliki w plikach i programy interaktywne ........................................................................ 213
Wywietlanie komunikatw z wejcia wsobnego ...................................................... 214
Dynamiczny tekst wejcia wsobnego ...................................................................... 215
Wejcie wsobne a sterowanie przebiegiem polece interaktywnych ........................... 219
Blokowanie podstawiania zmiennych ...................................................................... 222
Podsumowanie .......................................................................................................... 223
Zadania ..................................................................................................................... 224

Rozdzia 6. Przetwarzanie tekstu edytorem sed ................................................................................. 225


sed wprowadzenie ................................................................................................. 226
Wersje edytora sed .................................................................................................... 227
Instalowanie edytora sed ............................................................................................ 228
Instalacja faza wstpna .................................................................................... 228
Konfiguracja i waciwa instalacja .......................................................................... 229
Zasada dziaania edytora sed ..................................................................................... 230
Wywoywanie edytora ............................................................................................ 231
Polecenia edycji .................................................................................................... 232
Wywoywanie edytora z opcj -e i nazw pliku rdowego ......................................... 233
Opcje -n, --quiet i --silent ........................................................................................ 234
Bdy edycji .......................................................................................................... 236

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Skrypty powoki. Od podstaw


Wybieranie wierszy do obrbki ..................................................................................... 236
Adresowanie zakresowe ........................................................................................ 237
Negacja adresu .................................................................................................... 239
Postp adresu ...................................................................................................... 239
Podstawianie ............................................................................................................. 240
Znaczniki podstawiania ......................................................................................... 242
Alternatywny separator cigw ............................................................................... 243
Adresowanie podstawiania .................................................................................... 244
Zaawansowane wywoania sed .................................................................................... 245
Komentarze .......................................................................................................... 247
Polecenia wstawiania, doczania i zmiany .............................................................. 248
Adresowanie zaawansowane ....................................................................................... 249
Adresowanie wyraeniami regularnymi .................................................................... 250
Klasy znakw ....................................................................................................... 253
Adresowanie zakresowe z uyciem wyrae regularnych ........................................... 254
Adresowanie mieszane .......................................................................................... 255
Podstawienia zaawansowane ...................................................................................... 256
Odwoania do dopasowanych cigw ...................................................................... 256
Odwoania do podwyrae ..................................................................................... 258
Obszar zapasowy ....................................................................................................... 259
Dodatkowe rda informacji ....................................................................................... 261
Jednowierszowce .................................................................................................. 261
Wybrane polecenia sed ......................................................................................... 263
Mniej znane polecenia sed .................................................................................... 263
Rozszerzenia GNU ................................................................................................ 264
Podsumowanie .......................................................................................................... 264
Zadania ..................................................................................................................... 266

Rozdzia 7. Przetwarzanie tekstu w jzyku awk ................................................................................. 267


Czym jest awk (gawk, mawk, nawk, oawk)? .................................................................. 268
Gawk, czyli GNU awk ............................................................................................. 268
Jaka to wersja? .................................................................................................... 269
Instalowanie gawk ................................................................................................ 270
Zasada dziaania awk ................................................................................................. 272
Wywoywanie awk ....................................................................................................... 273
Instrukcja print .......................................................................................................... 276
Separatory pl ...................................................................................................... 279
Instrukcja printf .................................................................................................... 280
Modyfikatory formatu instrukcji printf ...................................................................... 282
Funkcja sprintf ...................................................................................................... 283
Zmienne w awk .......................................................................................................... 284
Zmienne uytkownika ............................................................................................ 284
Zmienne wbudowane ............................................................................................ 285
Instrukcje sterujce .................................................................................................... 288
Instrukcja if .......................................................................................................... 289
Operatory relacji ................................................................................................... 290
Funkcje arytmetyczne ............................................................................................ 291
Przekierowywanie wyjcia ...................................................................................... 293
Ptle while ........................................................................................................... 293
Ptle for ............................................................................................................... 294

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Spis treci

Funkcje ..................................................................................................................... 295


Dodatkowe rda informacji ....................................................................................... 296
Podsumowanie .......................................................................................................... 297
Zadania ..................................................................................................................... 297

Rozdzia 8. Potoki polece ......................................................................................................................299


Obsuga standardowego wejcia i wyjcia .................................................................... 300
Przekierowywanie standardowego wejcia i wyjcia .................................................. 300
Przekierowywanie wyjcia diagnostycznego ............................................................. 302
Przekierowywanie obu wyj: standardowego i diagnostycznego ................................ 302
Doczanie wyjcia do plikw ................................................................................. 304
Szybkie usuwanie zawartoci plikw ....................................................................... 305
Pozbywanie si wyjcia .......................................................................................... 306
Przetwarzanie w potoku polece .................................................................................. 307
Potoki polece uniksowych .................................................................................... 308
Tworzenie potokw ............................................................................................... 309
Rozdzia strumienia wyjciowego polecenie tee ................................................... 315
Podsumowanie .......................................................................................................... 316
Zadania ..................................................................................................................... 317

Rozdzia 9. Kontrola nad procesami .......................................................................................................319


Procesy ..................................................................................................................... 319
Odczytywanie identyfikatorw procesw .................................................................. 320
System plikw /proc ............................................................................................. 324
Eliminowanie procesw ......................................................................................... 328
Uruchamianie procesw ............................................................................................. 329
Uruchamianie procesw pierwszoplanowych ............................................................ 330
Uruchamianie procesw ta ................................................................................... 330
Uruchamianie procesw w podpowokach ............................................................... 330
Uruchamianie procesw poleceniem exec ............................................................... 331
Przechwytywanie wyjcia procesw .............................................................................. 332
Podstawianie polece ........................................................................................... 332
Przechwytywanie kodw powrotnych polece zewntrznych ....................................... 341
Podsumowanie .......................................................................................................... 342
Zadania ..................................................................................................................... 343

Rozdzia 10. Funkcje w skryptach powoki ...........................................................................................345


Definiowanie funkcji ................................................................................................... 346
Opatrywanie blokw kodu nazwami ........................................................................ 346
Bdy definicji funkcji ............................................................................................ 348
Uywanie funkcji ........................................................................................................ 349
Regua pierwszestwa definicji przed uyciem ......................................................... 350
Pliki funkcji ........................................................................................................... 353
Typowe bdy uycia funkcji ................................................................................... 354
Usuwanie funkcji .................................................................................................. 355
Funkcje z argumentami ............................................................................................... 355
Zwracanie wartoci z funkcji ........................................................................................ 356
Zasig zmiennych, czyli myl globalnie, dziaaj lokalnie ................................................. 359
Rekurencja ................................................................................................................ 362
Podsumowanie .......................................................................................................... 364
Zadania ..................................................................................................................... 365

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Skrypty powoki. Od podstaw


Rozdzia 11. Diagnostyka bdw w skryptach powoki .......................................................................367
Rozszyfrowywanie komunikatw o bdach ................................................................... 368
Szukanie brakujcych elementw skadni ............................................................... 369
Wyszukiwanie bdw skadniowych ....................................................................... 371
Techniki diagnostyczne w wykrywaniu bdw ............................................................... 374
Szukaj wstecz ....................................................................................................... 374
Szukaj oczywistych pomyek ................................................................................... 374
Szukaj wszelkich dziwactw ..................................................................................... 375
Szukaj niejawnych zaoe ..................................................................................... 376
Dziel i rzd .......................................................................................................... 376
Podziel skrypt na fragmenty ................................................................................... 377
Przeled dziaanie skryptu .................................................................................... 378
Co dwie gowy, to nie jedna ................................................................................... 378
Uruchamianie skryptw w trybie diagnostycznym ........................................................... 379
Blokowanie wykonywania polece .......................................................................... 379
ledzenie przebiegu wykonywania .......................................................................... 380
Poczenie opcji -n i -v ........................................................................................... 381
Nadzorowanie wykonywania skryptu ....................................................................... 381
Unikanie bdw, czyli dobre nawyki ............................................................................ 385
Porzdek musi by ................................................................................................ 385
Zbawienny wpyw komentarzy ................................................................................. 386
Treciwe komunikaty o bdach ............................................................................. 386
Lepsze wrogiem dobrego ....................................................................................... 387
Testy, testy i jeszcze raz testy ................................................................................ 387
Podsumowanie .......................................................................................................... 387
Zadania ..................................................................................................................... 388

Rozdzia 12. Obrazowanie danych MRTG ...........................................................................................391


Zasada dziaania MRTG .............................................................................................. 392
Monitorowanie innych danych ..................................................................................... 393
Instalowanie MRTG .................................................................................................... 393
Pisanie skryptw dla MRTG ......................................................................................... 394
Konfigurowanie MRTG ................................................................................................ 397
Konfigurowanie parametrw globalnych .................................................................. 398
Konfigurowanie obiektw obserwacji MRTG dla skryptw .......................................... 399
Dostosowywanie wyjcia MRTG .............................................................................. 400
Uruchamianie MRTG ................................................................................................... 404
Podgld wynikw MRTG ......................................................................................... 405
Konfigurowanie crona ............................................................................................ 406
Maksymalizacja wydajnoci MRTG .......................................................................... 407
Monitorowanie stanu systemu z MRTG ........................................................................ 408
Obrazowanie obcienia pamici ............................................................................ 408
Obrazowanie obcienia procesora ......................................................................... 412
Obrazowanie zajtoci dysku ................................................................................. 415
Monitorowanie sieci z MRTG ....................................................................................... 418
Monitorowanie aplikacji z MRTG .................................................................................. 421
Podsumowanie .......................................................................................................... 428
Zadania ..................................................................................................................... 428

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Spis treci

Rozdzia 13. Skrypty w subie administracji ........................................................................................431


Po co administratorom skrypty? .................................................................................. 431
Skrypty odciajce pami (administratora) ................................................................ 432
Skrypty w diagnostyce systemu ................................................................................... 435
Usuwanie pomniejszych niewygd ............................................................................... 443
Rafinacja danych ........................................................................................................ 445
Automatyzacja codziennych zada ............................................................................... 449
Podsumowanie .......................................................................................................... 450
Zadania ..................................................................................................................... 450

Rozdzia 14. Skrypty w rodowiskach graficznych ............................................................................453


Aplikacje biurowe ....................................................................................................... 454
Skrypty w OpenOffice.org ....................................................................................... 454
Moliwoci skryptowe edytora AbiWord ................................................................... 468
Moliwoci skryptowe edytora NEdit ....................................................................... 469
Skrypty w rodowisku graficznym Mac OS X .................................................................. 470
Open Scripting Architecture ................................................................................... 473
Podstawy jzyka AppleScript .................................................................................. 474
Terminal w Mac OS X ............................................................................................ 486
Skrypty w subie rozrywce .......................................................................................... 493
Skryptowe sterowanie odtwarzaczem XMMS ........................................................... 493
Skryptowe sterowanie odtwarzaczem Rhythmbox ..................................................... 494
Skryptowe sterowanie odtwarzaczem Totem ............................................................ 496
Stosowanie skryptw z innymi aplikacjami rodowiska graficznego ................................. 496
Co dalej? .................................................................................................................. 497
Podsumowanie .......................................................................................................... 497
Zadania ..................................................................................................................... 498

A Rozwizania zada ..............................................................................................................................499


B Wybrane polecenia ...............................................................................................................................521
Skorowidz ...............................................................................................................................................555

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\!spis.doc

Skrypt powoki nie jest odosobnion wysp. Dziaa jako program cile osadzony w rodowisku utworzonym dla niego przez system operacyjny. Na potrzeby skryptw powoki wikszo systemw udostpnia rodowisko charakterystyczne dla systemw uniksowych, co jest
wielce pomocne, bo pozwala na spjne wykonywanie odwoa do elementw rodowiska niezalenie od platformy programowej. Tak moliwo mamy w systemie Mac OS X (bazujcym
na Uniksie w wydaniu Berkeley) i Linuksie (systemie nie uniksowym, ale uniksopodobnym).
Nawet w Windows i QNX skrypty powoki otrzymuj do dyspozycji rodowisko charakterystyczne dla Uniksw.
rodowisko uniksowe cechuje si midzy innymi dostpnoci zmiennych rodowiskowych,
przechowujcych wane dane, choby o pooeniu plikw polece czy lokalizacji katalogu
domowego uytkownika skryptu.
W rozdziale zajmiemy si:
n

Analizowaniem ustawie rodowiskowych, odczytywaniem i ustawianiem zmiennych


rodowiskowych.

Dostosowywaniem wasnego konta, gwnie w zakresie rozruchu powoki.

Obsug argumentw wartoci majcych sterowa dziaaniem skryptu


a przekazywanych do skryptw za porednictwem wiersza polecenia.

Oznaczaniem plikw skryptw jako wykonywalnych, dziki czemu mona z nich


korzysta tak, jak z pozostaych polece zainstalowanych w systemie (jak choby
ls czy cp).

Zmienne rodowiskowe s rodzajem zmiennych powoki.


Zasadniczo zmienne rodowiskowe nie rni si wiele od pozostaych zmiennych powoki.
Rnice mona wypunktowa nastpujco:

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

169

170

Skrypty powoki. Od podstaw


n

Zmienne rodowiskowe s ustawiane przez rodowisko system operacyjny;


odbywa si to na etapie uruchamiania powoki (i nie ma w tym adnej magii, o czym
przekonamy si w dalszej czci rozdziau).

Zmienne powoki s zmiennymi lokalnymi wzgldem danego egzemplarza procesu


powoki na przykad egzemplarza powoki wywoanego do uruchomienia skryptu.
Tymczasem zmienne rodowiskowe s dziedziczone przez wszystkie egzemplarze
powoki i kady uruchamiany program.

Zmienne rodowiskowe posiadaj specjalne, ustalone konwencjami znaczenie.

Ustawienie zmiennej rodowiskowej odbywa si za porednictwem osobnej,


specjalnej operacji.

Wymienione tu rnice zostan szerzej skomentowane w nastpnych punktach.

Odczytywanie wartoci zmiennych rodowiskowych


Zmienne rodowiskowe obsuguje si w wielu kontekstach identycznie jak zmienne powoki.
Oznacza to, e jeli w skad rodowiska wchodzi zmienna rodowiskowa o nazwie HOME, to
za pomoc symbolu dolara ($) mona si odwoa do jej wartoci ($HOME). W tym aspekcie
korzystanie ze zmiennych rodowiskowych nie rni si od stosowania wasnych zmiennych
skryptu powoki.
Najwaniejsz cech zmiennych rodowiskowych jest to, e przechowuj wartoci, ktre powinny odwzorowywa ksztat rodowiska udostpnionego uytkownikowi, jak rwnie
uwzgldnia jego (uytkownika) preferencje (czsto za odzwierciedlaj preferencje administratora).
Na przykad zmienna rodowiskowa LANG, o ile w ogle zostanie ustawiona, powinna odzwierciedla schemat lokalizacji przyjty przez uytkownika kombinacj strony kodowej i regu
formatowania dla danego jzyka. Uytkownik anglojzyczny moe korzysta ze schematu
lokalizacji o nazwie en. Mieszkacy Zjednoczonego Krlestwa zechc zapewne korzysta ze
schematu lokalizacji uwzgldniajcego lokalne reguy formatowania, o nazwie en_UK; Amerykanie w jego miejsce zastosuj pewnie odmian waciw dla Stanw Zjednoczonych en_US1.
Ustawienia te s o tyle istotne, e steruj dziaaniem wielu programw, choby systemowego
programu kontroli poprawnoci pisowni.
Skrypt powoki powinien honorowa ustawienia zmiennych rodowiskowych wszdzie tam,
gdzie jest to zasadne. Jest to o tyle skomplikowane, e w rnych systemach zestawy dostpnych zmiennych rodowiskowych rni si skadem. Skrypt powinien wic kadorazowo, przed odwoaniem si do zmiennej rodowiskowej, sprawdzi jej istnienie, ewentualnie
korzysta z wartoci domylnej.
List najczciej spotykanych zmiennych rodowiskowych zawiera tabela 4.1:

170

Dla jzyka polskiego odpowiednia moe by warto pl_PL przyp. tum.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

171

Tabela 4.1. Wybrane zmienne rodowiskowe


Zmienna

Znaczenie

COLUMNS

Liczba znakw mieszczcych si w pojedynczym wierszu okna powoki (terminala).

DISPLAY

Nazwa ekranu docelowego dla programw korzystajcych z usug serwera X Window System.

HISTSIZE

Liczba wpisw przechowywanych w historii polece (dotyczy powok bash i ksh).

HOME

Nazwa katalogu domowego uytkownika.

HOSTNAME

Nazwa wza (identyfikujca komputer w sieci).

LANG

Nazwa schematu lokalizacji jzykowej.

LINES

Liczba wierszy tekstu mieszczcych si w oknie powoki (terminalu)

PATH

cieka przeszukiwania lista katalogw przeszukiwanych przy wywoywaniu polece.

PWD

Nazwa biecego katalogu roboczego.

SHELL

Nazwa domylnej powoki.

TERM

Typ terminala.

USER

Nazwa konta uytkownika.

List zmiennych rodowiskowych widocznych dla powoki wywouje si poleceniem set.


W csh i tcsh zamiast set naley stosowa polecenie setenv (szczegy w dalszej
czci omwienia).
Wbudowane polecenie powoki o nazwie set suy midzy innymi do wypisywania list ustawionych zmiennych. Tam, gdzie jest moliwo korzystania z rnych systemw operacyjnych, warto porwna sobie wyniki jego dziaania. Przytoczone poniej przykady ilustruj
dobr zmiennych rodowiskowych w rnych systemach operacyjnych.
Zwr uwag na to, e wykaz zawiera nie tylko prawdziwe zmienne rodowiskowe,
ale o tym powiemy sobie w dalszej czci omwienia.

sprbuj sam rodowisko powoki w Linuksie


W dystrybucji Fedora Core 2 wywoanie polecenia set daje nastpujcy efekt:
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhaBlinux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/eBc/DIR_COLORS.xBerm
COLORTERM=gnome-Berminal
COLUMNS=73
DESKTOP_SESSION=defaulB
DIRSTACK=()
DISPLAY=:0.0
EUID=500

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

171

172

Skrypty powoki. Od podstaw


GDMSESSION=defaulB
GNOME_DESKTOP_SESSION_ID=DefaulB
GNOME_KEYRING_SOCKET=/Bmp/keGring-BNORrP/sockeB
GROUPS=()
GTK_RC_FILES=/eBc/gBk/gBkrc:/home2/ericfj/.gBkrc-1.2-gnome2
G_BROKEN_FILENAMES=1
HISTFILE=/home2/ericfj/.bash_hisBorG
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home2/ericfj
HOSTNAME=kirkwall
HOSTTYPE=i386
IFS=$' IBIn'
INPUTRC=/eBc/inpuBrc
KDEDIR=/usr
LANG=en_US.UTF-8
LESSOPEN='/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=ericfj
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or
=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.bBm=00;32:
*.baB=00;32:*.sh=00;32:*.csh=00;32:*.Bar=00;31:*.Bg.=00;31:*.arj=00;31:*.Ba.=00;31:*.
l.h=00;31:*..ip=00;31:*..=00;31:*.Z=00;31:*.g.=00;31:*.b.2=00;31:*.b.=00;31:*.B.=00;3
1:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;3
5:*.png=00;35:*.Bif=00;35:'
MACHTYPE=i386-redhaB-linux-gnu
MAIL=/var/spool/mail/ericfj
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr//11R6/bin:/home2/ericfj/bin:
/usr/java/j2sdk1.4.1_03/bin:/opB/jexB/bin
PIPESTATUS=([0]="0")
PPID=19277
PROMPT_COMMAND='echo -ne "I033]0;$RUSER_C$RHOSTNAME%%.*_:$RPWD/]HOME/S_I007"'
PS1='[IuCIh IW]I$'
PS2='> '
PS4='+ '
PWD=/home2/ericfj/web/local
QTDIR=/usr/lib/QB-3.3
SESSION_MANAGER=local/kirkwall:/Bmp/.ICE-unix/19167
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:hisBexpand:hisBorG:inBeracBive-commenBs:moniBor
SHLVL=2
SSH_AGENT_PID=19215
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/Bmp/ssh-Bke19167/agenB.19167
SUPPORTED=en_US.UTF-8:en
TERM=xBerm
UID=500
USER=ericfj
WINDOWID=20971638
/AUTHORITY=/home2/ericfj/./auBhoriBG
_=env

172

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

173

Jak to dziaa?
Z przytoczonego wypisu wynika, e w Linuksie zestaw zmiennych rodowiskowych jest wcale
pokany. Wiele z tych zmiennych to wartoci kojarzone z konkretnymi programami czy operacjami. Na przykad zmienne rodowiskowe MAILCHECK i MAIL okrelaj czstotliwo sprawdzania dostpnoci nowych wiadomoci poczty elektronicznej i miejsce, w ktrym naley ich
szuka.
Przyjo si, e nazwy zmiennych rodowiskowych zawieraj wycznie wielkie litery
warto trzyma si tej konwencji.
Dokumentacja kadego programu, ktry korzysta ze zmiennych rodowiskowych, powinna
ten fakt sygnalizowa i wymienia wykorzystywane zmienne oraz ich wpyw na dziaanie
programu. Na przykad polecenie suce do wywietlania stron dokumentacji systemowej,
man, bazuje na zmiennej rodowiskowej MANPATH, ktra (o ile zostanie ustawiona) okrela
pooenie plikw dokumentacji.

sprbuj sam rodowisko powoki w Mac OS X


W systemie Mac OS X powiniene mie dostp do nastpujcych zmiennych:
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="powerpc-appledarwin7.0")
BASH_VERSION='2.05b.0(1)-release'
COLUMNS=80
DIRSTACK=()
EUID=501
GROUPS=()
HISTFILE=/Users/ericfj/.bash_hisBorG
HISTFILESIZE=500
HISTSIZE=500
HOME=/Users/ericfj
HOSTNAME=SBromness.local
HOSTTYPE=powerpc
IFS=$' IBIn'
LINES=24
LOGNAME=ericfj
MACHTYPE=powerpc-apple-darwin7.0
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=darwin7.0
PATH=/bin:/sbin:/usr/bin:/usr/sbin
PIPESTATUS=([0]="0")
PPID=524
PS1='Ih:Iw IuI$'
PS2='> '
PS4='+ '
PWD=/Users/ericfj
SECURITYSESSIONID=10967b0

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

173

174

Skrypty powoki. Od podstaw


SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:hisBexpand:hisBorG:inBeracBive-commenBs:moniBor
SHLVL=1
TERM=vB100
TERM_PROGRAM=iTerm.app
UID=501
USER=ericfj
_=/eBc/bashrc
__CF_USER_TE/T_ENCODING=0x1F5:0:0

Jak to dziaa?
Zwrmy uwag na podobiestwo wypisu uzyskanego w systemie Mac OS X z tym znanym z Linuksa. Dla skryptu powoki oba systemy stanowi bardzo podobne rodowiska
wykonania. To wygodne (dla programisty skryptw), zwaszcza jeli ujednolicenie rodowiska zestawi si z ogln odmiennoci obu tych systemw.

sprbuj sam rodowisko powoki w Windows XP


W systemie Windows XP, z protez w postaci pakietu Cygwin, skrypt ma dostp do nastpujcych zmiennych powoki:
$ set
!::='::I'
!C:='C:IcGgwinIbin'
ALLUSERSPROFILE='C:IDocumenB and SeBBingsIAll Users'
ANT_HOME='C:IericfjIjavaIapache-anB-1.5.4'
APPDATA='C:IDOcumenBs and SeBBingsIericfjIApplicaBion DaBa'
BASH=/usr/bin/bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i686-pc-cGgwin")
BASH_VERSION='2.05b.0(1)-release'
COLUMNS=80
COMMONPROGRAMFILES='C:IProgram FilesICommon Files'
COMPUTERNAME=GURNESS
COMSPEC='C:IWINDOWSIsGsBem32Icmd.exe'
CVS_RSH=/bin/ssh
DIRSTACK=()
EUID=1006
FP_NO_HOST_CHECK=NO
GROUPS=()
HISTFILE=/home/ericfj/.bash_hisBorG
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/ericfj
HOMEDRIVE=C:
HOMEPATH='DocumenBs and SeBBingsIericfj'
HOSTNAME=kirkwall
HOSTTYPE=i686
IFS=$' IBIn'
INFOPATH=/usr/local/info:/usr/info:/usr/share/info:/usr/auBoBool/devel/info:/usr/auBo
Bool/sBable/info:
JAVA_HOME='C:Ij2sdk1.4.2_01'
LINES=25
LOGONSERVER='IIKIRKWALL'

174

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

175

MACHTYPE=i686-pc-cGgwin
MAILCHECK=60
MAKE_MODE=unix
MANPATH=/usr/local/man:/usr/man:/usr/share/man:/usr/auBoBool/devel/man::/usr/ssl/man
MAVEN_HOME='C:IericfjIjavaInamen-1.0-rc1'
NUMBER_OF_PROCESSORS=1
OLDPWD=/usr/bin
OPTERR=1
OPTIND=1
OS=Windows_NT
OSTYPE=cGgwin
PALMTOPCENTERDIR='C:IProgram FilesISharp Zaurus 2IQBopia DeskBop'
PATH=/usr/local/bin:/usr/bin:/bin:/usr//11R6/bin:/cGgdrive/c/WINDOWS/sGsBem32:/cGgdri
ve/c/WINDOWS:/cGgdrive/c/WINDOWS/SGsBem32/Wbem:/cGgdrive/c/ericfj/apps:/cGgdrive/c/er
icfj/java/apache-anB-1.5.4/bin:/cGgdrive/c/j2sdk1.4.2_01/bin:/usr/bin:.
PATHE/T='.COM;.E/E;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH'
PIPESTATUS=([0]="0")
PPID=1
PRINTER='HP LaserJeB 2100 PCL6'
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER='x86 FamilG 15 Model 2 SBepping 9, GenuineInBel'
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0209
PROGRAMFILES='C:IProgram Files'
PROMPT='$P$G'
PS1='$II[II033]0;IIwII007InII033[32mII]IIuCIIh II[II033[33mIIwII033[0mII]In$ '
PS2='> '
PS4='+ '
PWD=/home/ericfj
SESSIONNAME=Console
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:hisBexpand:hisBorG:inBeracBive-commenBs:moniBor
SHLVL=1
SYSTEMDRIVE=C:
SYSTEMROOT='C:IWINDOWS'
TEMP=/cGgdrive/c/DOCUMES1/ericfj/LOCALSS1/Temp
TERM=cGgwin
TMP=/cGgdrive/c/DOCUMES1/ericfj/LOCALSS1/Temp
UID=1006
USER=ericfj
USERDOMAIN=ORKNEY
USERNAME=ericfj
USERPROFILE='C:IDocumenBs and SeBBingsIericfj'
WINDIR='C:IWINDOWS'
_=/home/ericfj/.bashrc
f=

Jak to dziaa?
W tym przykadzie wida wyranie spucizn po systemie DOS, choby w ciekach dostpu,
zaczynajcych si od litery dysku (C:). Pakiet Cygwin znakomicie jednoczy wymagania co
do rodowiska widocznego dla powoki z realiami systemw z rodziny Windows. Wida tu
na przykad, e zmienne TEMP (Unix) i TMP (Windows) s ustawione zgodnie z lokalizacj
systemowych katalogw plikw tymczasowych, podobnie jak zmienne USER (Unix) i USERNAME
(Windows).

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

175

176

Skrypty powoki. Od podstaw

Zmienne lokalne a zmienne rodowiskowe


Technicznie rzecz biorc, polecenie set, wykorzystywane w kilku ostatnich przykadach, wypisuje wszystkie ustawione zmienne powoki, w tym zarwno zmienne rodowiskowe, jak
i wszelkie pozostae, zwane zmiennymi lokalnymi powoki. Zmienne lokalne to zmienne dostpne w obrbie biecej powoki. Za zmienne rodowiskowe to te zmienne powoki, ktre
zostay wyeksportowane. Eksportowanie udostpnia te zmienne wszystkim programom potomnym, rwnie nowouruchamianym powokom, czyli powokom uruchamianym z wntrza
biecej powoki. Proste?
Moliwo uruchamiania powoki z wntrza powoki oznacza moliwo tworzenia hierarchii powok, co oznacza z kolei, e skrypty mog dziaa w obrbie powoki pierwotnej,
podpowoki, podpodpowoki i tak dalej. Przy logowaniu uytkownika na jego konto systemowe, system uruchamia przypisan do tego konta aplikacj; zwykle jest to wanie powoka.
Ta powoka jest rodzicem wszystkich programw uruchamianych potem przez uytkownika, a wic i wszystkich wywoywanych pniej powok. Powoka-rodzic, czyli powoka
pierwotna, nosi miano powoki logowania (bo jest uruchamiana przy logowaniu uytkownika). I to ona decyduje o ksztacie rodowiska dostpnego dla procesw potomnych. Powoka pierwotna uruchamia potem szereg aplikacji. Na przykad w systemie Linux dziaajcym w trybie graficznym powoka logowania uruchamia proces serwera X Window System.
Serwer X uruchamia potem zestaw aplikacji obsugujcych rodowisko graficzne, w tym
wszelkie okna powoki (okna wirtualnych terminali) udostpniane uytkownikowi tego rodowiska. Kade z tak uruchomionych okien powoki jest aplikacj graficzn i kade wywouje z kolei program powoki. Tak wywoane powoki s podpowokami.
Z tych podpowok mona uruchomi dalsze (pod)powoki. wiczylimy to wielokrotnie przy
uruchamianiu kolejnych skryptw przykadowych. Za kadym razem kiedy w wierszu polecenia wpisywalimy sh, bash czy csh, uruchamialimy podpowok powok potomn powoki biecej (to wanie midzy innymi dlatego w systemach uniksowych, jak rwnie
w Linuksie, dziaa stale dua liczba procesw).
Kiedy tworzy si zmienn rodowiskow, ustalon przy tej okazji warto udostpnia si podpowokom powokom potomnym powoki biecej, uruchamiajcej skrypt. Jest to podane, kiedy skrypt wywouje zewntrzne skrypty bd polecenia i ma do nich przekazywa
wartoci sterujce; mona to osign wanie za porednictwem zmiennych rodowiskowych.
Ustawienie zmiennej rodowiskowej nie modyfikuje jednak rodowiska powoki nadrzdnej
(powoki-rodzica) eksport oznacza propagacj zmiennej w d hierarchii, nigdy w gr.
W wikszoci przypadkw rodowisko powok ustala si przy ich uruchamianiu. Dokonuje si
tego za porednictwem specjalnych plikw konfiguracyjnych, omawianych w podrozdziale
Dostosowywanie wasnego konta.
W razie wtpliwoci naley trzyma si poniszych wytycznych:
n

176

rodowisko wasnego konta naley ustala za porednictwem standardowych


plikw konfiguracyjnych, omawianych w podrozdziale Dostosowywanie
wasnego konta.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu


n

Zastane rodowisko naley modyfikowa zmiennymi ustawianymi przez skrypty


powoki jedynie wtedy, kiedy skrypty te wywouj programy lub skrypty zewntrzne,
dla ktrych konieczna jest modyfikacja bd uzupenienie rodowiska.

We wszystkich pozostaych przypadkach naley powstrzyma si od eksportowania


zmiennych powoki.

177

sprbuj sam Wykaz zmiennych rodowiskowych


Do wypisania wartoci zmiennych eksportowanych, czyli jedynych prawdziwych zmiennych
rodowiskowych, suy polecenie env albo printenv. Oto przykad:
$ printenv
SSH_AGENT_PID=22389
HOSTNAME=kirkwall
SHELL=/bin/bash
TERM=xBerm
HISTSIZE=1000
GTK_RC_FILES=/eBc/gBk/gBkrc:/home2/ericfj/.gBkrc-1.2-gnome2
WINDOWID=20971679
OLDPWD=/home2/ericfj/wriBing/beginning_shell_scripBing
QTDIR=/usr/lib/QB-3.3
USER=ericfj
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or
=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.bBm=00;32:
*.baB=00;32:*.sh=00;32:*.csh=00;32:*.Bar=00;31:*.Bg.=00;31:*.arj=00;31:*.Ba.=00;31:*.
l.h=00;31:*..ip=00;31:*..=00;31:*.Z=00;31:*.g.=00;31:*.b.2=00;31:*.b.=00;31:*.B.=00;3
1:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;3
5:*.png=00;35:*.Bif=00;35:'
GNOME_KEYRING_SOCKET=/Bmp/keGring-Q0LxNA/sockeB
SSH_AUTH_SOCK=/Bmp/ssh-NVH22341/agenB.22341
KDEDIR=/usr
SESSION_MANAGER=local/kirkwall:/Bmp/.ICE-unix/22341
MAIL=/var/spool/mail/ericfj
DESKTOP_SESSION=defaulB
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr//11R6/bin:/home2/ericfj/bin:
/usr/java/j2sdk1.4.1_03/bin:/opB/jexB/bin
INPUTRC=/eBc/inpuBrc
PWD=/home2/ericfj/wriBing/beginning_shell_scripBing/scripBs
LANG=en_US.UTF-8
GDMSESSION=defaulB
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HOME=/home2/ericfj
SHLVL=2
GNOME_DESKTOP_SESSION_ID=DefaulB
MY_SHELL=/usr/bin/emacs2
LOGNAME=ericfj
LESSOPEN=|/usr/bin/lesspipe.sh %s
DISPLAY=:0.0
G_BROKEN_FILENAMES=1
COLORTERM=gnome-Berminal
/AUTHORITY=/home2/ericfj/./auBhoriBG
_=/usr/bin/prinBenv

Rzecz jasna, w systemie innym ni testowy uzyskany wykaz moe si rni od powyszego.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

177

178

Skrypty powoki. Od podstaw

Jak to dziaa?
Zestaw zmiennych wypisywanych przez polecenie printenv jest mniej obszerny ni podobny
wypis uzyskany poleceniem set. Rnica obejmuje ponisze zmienne, wypisywane przez set
a pomijane przez printenv:
BASH=/bin/bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhaBlinux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/eBc/DIR_COLORS.xBerm
COLUMNS=80
DIRSTACK=()
EUID=500
GROUPS=()
HISTFILE=/home2/ericfj/.bash_hisBorG
HISTFILESIZE=1000
HOSTTYPE=i386
IFS=$' IBIn'
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=24
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or
=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.bBm=00;32:
*.baB=00;32:*.sh=00;32:*.csh=00;32:*.Bar=00;31:*.Bg.=00;31:*.arj=00;31:*.Ba.=00;31:*.
l.h=00;31:*..ip=00;31:*..=00;31:*.Z=00;31:*.g.=00;31:*.b.2=00;31:*.b.=00;31:*.B.=00;3
1:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;3
5:*.png=00;35:*.Bif=00;35:'
MACHTYPE=i386-redhaB-linux-gnu
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PIPESTATUS=([0]="0")
PPID=22454
PROMPT_COMMAND='echo -ne "I033]0;$RUSER_C$RHOSTNAME%%.*_:$RPWD/]HOME/S_I007"'
PS1='[IuCIh IW]I$'
PS2='> '
PS4='+ '
SHELLOPTS=braceexpand:emacs:hashall:hisBexpand:hisBorG:inBeracBive-commenBs:moniBor
SUPPORTED=en_US.UTF-8:en_US:en
UID=500
_=

Wymienione zmienne s zmiennymi lokalnymi powoki, a nie zmiennymi rodowiskowymi.

Wypisywanie zmiennych rodowiskowych w powoce C


W powoce C rwnie mamy do dyspozycji polecenie set, jednak nie ujawnia ono kompletnego
rodowiska:
$ set
COLORS /eBc/DIR_COLORS.xBerm
_
!! | sorB

178

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

179

addsuffix
argv
()
cwd
/home2/ericfj
dirsBack
/home2/ericfj
dspmbGBe
euc
echo_sBGle
boBh
ediB
file
/home2/ericfj/.i18n
gid
500
group ericfj
hisBorG 100
home
/home2/ericfj
killring
30
owd
paBh
(/usr/kerberos/bin /usr/local/mo.illa /bin /usr/bin /usr/local/bin
/usr//11R6/bin /home2/ericfj/bin /usr/java/j2sdk1.4.1_03/bin /home2/ericfj/eclipse
/home2/ericfj/apache-anB-1.5.4/bin)
prompB [%nC%m %c]$
prompB2 CORRECT>%R (G|n|e|a)?
shell /bin/Bcsh
shlvl 2
sourced 1
sBaBus 0
Bcsh
6.12.00
Berm
xBerm
BBG
pBs/19
uid
500
user
ericfj
version Bcsh 6.12.00 (AsBron) 2002-07-23 (i386-inBel-linux) opBions
8b,nls,dl,al,kan,rh,color,dspm,filec

Polecenie set wypisuje tu zestaw wewntrznych ustawie powoki C, a nie list zmiennych
rodowiskowych. Odpowiednikiem polecenia set z powoki Bournea jest tu setenv. Wywoanie polecenia setenv w powoce T C w systemie Linux powinno da rezultaty podobne do
poniszego:
$ setenv | sort
COLORTERM=gnome-Berminal
CVSROOT=:pserver:ericfjClocalhosB:/home2/cvsrepos
DESKTOP_SESSION=defaulB
DISPLAY=:0.0
G_BROKEN_FILENAMES=1
GDMSESSION=defaulB
GNOME_DESKTOP_SESSION_ID=DefaulB
GNOME_KEYRING_SOCKET=/Bmp/keGring-w8mvQR/sockeB
GROUP=ericfj
GTK_RC_FILES=/eBc/gBk/gBkrc:/home2/ericfj/.gBkrc-1.2-gnome2
HOME=/home2/ericfj
HOST=kirkwall
HOSTNAME=kirkwall
HOSTTYPE=i386-linux
INPUTRC=/eBc/inpuBrc
JAVA_HOME=/usr/java/j2sdk1.4.1_03
KDEDIR=/usr
LANG=en_US.UTF-8
LESSOPEN=|/usr/bin/lesspipe.sh %s
LOGNAME=ericfj

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

179

180

Skrypty powoki. Od podstaw


LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=
01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.bBm=00;32:*
.baB=00;32:*.sh=00;32:*.csh=00;32:*.Bar=00;31:*.Bg.=00;31:*.arj=00;31:*.Ba.=00;31:*.l
.h=00;31:*..ip=00;31:*..=00;31:*.Z=00;31:*.g.=00;31:*.b.2=00;31:*.b.=00;31:*.B.=00;31
:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35
:*.png=00;35:*.Bif=00;35:
MACHTYPE=i386
MAIL=/var/spool/mail/ericfj
OSTYPE=linux
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/local/mo.illa:/bin:/usr/bin:/usr/local/bin
:/usr//11R6/bin:/home2/ericfj/bin:/usr/java/j2sdk1.4.1_03/bin:/home2/ericfj/eclipse:/
home2/ericfj/apache-anB-1.5.4/bin
PWD=/home2/ericfj
QTDIR=/usr/lib/QB-3.3
SESSION_MANAGER=local/kirkwall:/Bmp/.ICE-unix/27573
SHELL=/bin/Bcsh
SHLVL=2
SSH_AGENT_PID=27574
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/Bmp/ssh-bxG27574/agenB.27573
SUPPORTED=en_US.UTF-8:en_US:en
TERM=xBerm
USER=ericfj
USERNAME=ericfj
VENDOR=inBel
WINDOWID=23068746
/AUTHORITY=/home2/ericfj/./auBhoriBG

Do wypisywania listy zmiennych rodowiskowych w powoce C mona wykorzystywa rwnie polecenia printenv i env, jak poniej:
] printenv
COLORTERM=gnome-Berminal
CVSROOT=:pserver:ericfjClocalhosB:/home2/cvsrepos
DESKTOP_SESSION=defaulB
DISPLAY=:0.0
G_BROKEN_FILENAMES=1
GDMSESSION=defaulB
GNOME_DESKTOP_SESSION_ID=DefaulB
GNOME_KEYRING_SOCKET=/Bmp/keGring-w8mvQR/sockeB
GROUP=ericfj
GTK_RC_FILES=/eBc/gBk/gBkrc:/home2/ericfj/.gBkrc-1.2-gnome2
HOME=/home2/ericfj
HOST=kirkwall
HOSTNAME=kirkwall
HOSTTYPE=i386-linux
INPUTRC=/eBc/inpuBrc
JAVA_HOME=/usr/java/j2sdk1.4.1_03
KDEDIR=/usr
LANG=en_US.UTF-8
LESSOPEN=|/usr/bin/lesspipe.sh %s
LOGNAME=ericfj
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=
01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.bBm=00;32:*
.baB=00;32:*.sh=00;32:*.csh=00;32:*.Bar=00;31:*.Bg.=00;31:*.arj=00;31:*.Ba.=00;31:*.l
.h=00;31:*..ip=00;31:*..=00;31:*.Z=00;31:*.g.=00;31:*.b.2=00;31:*.b.=00;31:*.B.=00;31
:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35
:*.png=00;35:*.Bif=00;35:

180

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

181

MACHTYPE=i386
MAIL=/var/spool/mail/ericfj
OSTYPE=linux
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/local/mo.illa:/bin:/usr/bin:/usr/local/bin
:/usr//11R6/bin:/home2/ericfj/bin:/usr/java/j2sdk1.4.1_03/bin:/home2/ericfj/eclipse:/
home2/ericfj/apache-anB-1.5.4/bin
PWD=/home2/ericfj
QTDIR=/usr/lib/QB-3.3
SESSION_MANAGER=local/kirkwall:/Bmp/.ICE-unix/27573
SHELL=/bin/Bcsh
SHLVL=2
SSH_AGENT_PID=27574
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/Bmp/ssh-bxG27574/agenB.27573
SUPPORTED=en_US.UTF-8:en_US:en
TERM=xBerm
USER=ericfj
USERNAME=ericfj
VENDOR=inBel
WINDOWID=23068746
/AUTHORITY=/home2/ericfj/./auBhoriBG

Testowanie rodowiska
Pado ju stwierdzenie, e skrypt powoki powinien honorowa zastane ustawienia rodowiskowe. Ale skrypt musi rwnie obsugiwa sytuacje, w ktrych potrzebne mu zmienne nie
zostay w ogle ustawione trzeba by przygotowanym na wszystkie ewentualnoci.
Na przykad zmienna rodowiskowa DISPLAD zawiera nazw ekranu systemu X Window
System, reprezentujcego kombinacj monitora i urzdze wskazujcych. Programy graficzne
wykorzystuj ustawienie zmiennej DISPLAD do kierowania komunikatw do odpowiedniego serwera X. W systemach wielodostpnych i rozproszonych ustawienie to ma krytyczne
znaczenie.
Serwer X Window System jest podstaw podsystemu graficznego w kadym systemie uniksowym i linuksowym. W systemach Mac OS X serwer X dziaa jako podsystem dodatkowy.
Iksy da si nawet uruchomi w systemie Windows (za pomoc pakietu Cygwin).
Jeli zmienna rodowiskowa DISPLAD posiada warto, programy odwoujce si do serwera
X Window System powinny j uwzgldnia. W przypadku braku tej zmiennej trzeba jednak
wybra jedn z trzech opcji:
n

przyj dla DISPLAD warto domyln (:0.0);

zaoy niedostpno serwera X Window System;

powiadomi uytkownika o braku wartoci zmiennej DISPLAD i przerwa dziaanie


skryptu.

Nie ma tu adnych czarw, potrzebna tylko decyzja. Podobne decyzje trzeba podejmowa
w obliczu braku innych potrzebnych skryptowi zmiennych. Strategie obsugi takich sytuacji
przewiczymy na poniszym przykadzie.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

181

182

Skrypty powoki. Od podstaw

sprbuj sam Sprawdzanie zmiennych rodowiskowych


Zapiszmy poniszy kod w pliku o nazwie check_env:
] KonBrola .miennGch rodowiskowGch.
] Usu sGmbol komenBar.a . ponis.Gch wiers.G, abG usun definicj .miennej.
]unseB DISPLAY
if [ "$DISPLAY" == "" ]
Bhen
echo "Brak .miennej DISPLAY, pr.Gjmuj :0.0 jako warBo domGln."
DISPLAY=":0.0"
fi

]unseB SHELL
if [ "$SHELL" == "" ]
Bhen
echo "WGbieram /bin/bash jako podan powok."
SHELL=/bin/bash
fi

]unseB USER
if [ "$USER" == "" ]
Bhen
echo -n "Podaj na.w swojego konBa: "
read USER
fi

]unseB HOME
if [ "$HOME" == "" ]
Bhen
] Sprawd.enie kaBalogu domowego w Mac OS /.
if [ -d "/Users/$USER" ]
Bhen
HOME="/Users/$USER"
] Sprawd.enie kaBalogu domowego w Linuksie.
elif [ -d "/home/$USER" ]
Bhen
HOME="/home/$USER"

fi

182

else
echo -n "Podaj swj kaBalog domowG: "
read HOME
echo
fi

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

183

] WGpisanie warBoci konBrolowanGch .miennGch.


echo
echo
echo
echo

"DISPLAY=$DISPLAY"
"SHELL=$SHELL"
"USER=$USER"
"HOME=$HOME"

Skrypt powinien zachowywa si jak poniej:


$ sh check_env
DISPLAY=:0.0
SHELL=/bin/bash
USER=ericfj
HOME=/home2/ericfj

Gdyby cz ze zmiennych rodowiskowych, do ktrych odwouje si skrypt, bya nieustawiona, skrypt bdzie zachowywa si nieco inaczej. Oto przykadowe uruchomienie skryptu
w systemie Mac OS X:
$ sh check_env
Brak .miennej DISPLAY, pr.Gjmuj :0.0 jako warBo domGln.
DISPLAY=:0.0
SHELL=/bin/bash
USER=ericfj
HOME=/home2/ericfj

Jak wida, w systemie Mac OS X serwer X Window System nie jest domylnie uruchamiany.

Jak to dziaa?
W skrypcie check_env stosowana jest oglna strategia polegajca na ustalaniu zdroworozsdkowych wartoci dla nieobecnych zmiennych rodowiskowych. Za w przypadku tych
zmiennych, dla ktrych nie mona odgadn wartoci, skrypt pyta o nie uytkownika.
W obliczu braku wartoci zmiennej skrypt prbuje samodzielnie wytypowa brakujce dane.
Kiedy nie ma wartoci dla zmiennej HOME, skrypt sprawdza istnienie katalogu /Users/nazwa_
konta, ktry w Mac OS X jest typowo katalogiem domowym uytkownika konta nazwa_konta.
Sprawdza te istnienie katalogu /home/nazwa_konta, charakterystycznego dla systemw uniksowych i Linuksa. Jeli za nie uda si potwierdzi istnienia adnego z tych katalogw, trzeba
uciec si do odpytania uytkownika.
Przy okazji testowania skrypt ustawia wartoci zmiennych rodowiskowych. Ustawia np.
zmienn DISPLAD na warto domyln :0.0. Takie ustawienie powinno by odpowiednie dla
wielu systemw uniksowych i linuksowych, ale nie dla Mac OS X, gdzie domylnie nie korzysta si z serwera X Window System.
Skrypt check_env w razie potrzeby samodzielnie ustawi zmienn DISPLAD. Zauwa, e ustawienie nie jest uzupenione eksportem zmiennej, przez co jest widoczne jedynie w obrbie
biecego skryptu. Dotyczy to rwnie pozostaych testw i ustawie podejmowanych
w skrypcie.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

183

184

Skrypty powoki. Od podstaw


Test wartoci zmiennej rodowiskowej SHELL koczy si (w przypadku braku wartoci) ustawieniem na warto /bin/bash i wystosowaniem komunikatu informujcego uytkownika
o takim wyborze.
W obliczu braku zmiennej USER skrypt pyta uytkownika o nazw jego konta. Mona by co
prawda podejmowa prby odgadnicia tej nazwy, ale jest to do trudne znacznie atwiej
zapyta o to samego zainteresowanego.
Test zmiennej rodowiskowej HOME wymaga wczeniejszego ustalenia wartoci zmiennej USER.
Jeli HOME nie ma wartoci, skrypt prbuje ustali dla niej warto typow dla systemu Mac
OS X, a jeli to si nie uda, ustala warto typow dla pozostaych systemw uniksowych
i uniksopodobnych.
Jeli aden z testowanych katalogw domowych nie istnieje, skrypt odwouje si do instancji
ostatecznej uytkownika.
Na kocu skryptu nastpuje wypisanie wartoci wszystkich czterech zmiennych rodowiskowych.
Dziaanie tych czci skryptu, ktre ustalaj domylne (podane) wartoci nieobecnych zmiennych, mona zweryfikowa, usuwajc oznaczenie komentarza z polece unset. Polecenie unset
usuwa zmienn, zmuszajc skrypt do jej samodzielnego ustawienia z wykorzystaniem zaprogramowanych strategii.
Uaktywnienie wiersza oznaczonego symbolem komentarza sprowadza si
do usunicia znaku komentarza (#) z pocztku wiersza.
To czsto stosowana technika testowania dziaania poszczeglnych czci skryptw.

Ustawianie zmiennych rodowiskowych


Zmienne rodowiskowe odczytuje si tak samo jak wszelkie zmienne powoki. Ustawia si
je rwnie podobnie. Ale aby ustawienia te trwale osadzi w rodowisku, trzeba wykona
dodatkowe czynnoci.
Trzeba pamita, e owo rodowisko obejmuje swym wpywem jedynie programy i skrypty
wywoywane z wntrza danego skryptu, czyli jedynie dla powok i programw potomnych.
Ustawienia pierwotne mona modyfikowa za porednictwem plikw wymienianych w podrozdziale Dostosowywanie wasnego konta.
Zmienne rodowiskowe ustawia si z dwch powodw:
n

celem dostosowania rodowiska pracy do wasnych upodoba i potrzeb;

celem ustawienia zmiennej rodowiskowej na potrzeby skryptu, ktry si do tej


zmiennej odwouje.

Ustawienie zmiennej rodowiskowej wymaga operacji eksportowania. Samo ustawienie zmiennej odbywa si przy uyciu zwykej skadni przypisania wartoci do zmiennej:

184

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

185

ZMIENNA=WARTO

Eksportowanie zmiennej do rodowiska tak, aby jej warto bya widoczna dla procesw potomnych czyli konwersja zwykej zmiennej powoki do postaci penoprawnej zmiennej
rodowiskowej wymaga wywoania polecenia export:
exporB ZMIENNA

Std w wielu skryptach powoki da si zauway nastpujce konstrukcje:


var=value
exporB var

Oba polecenia mona czy do postaci pojedynczego wiersza polecenia wystarczy skorzysta ze rednika:
var=value; exporB var

Mona te skorzysta ze skrconego zapisu, angaujcego pojedyncze polecenie export:


exporB var=value

Polecenie export moe eksportowa wicej ni jedn zmienn, jak tutaj:


var1=value1
var2=value2
var3=value3
exporB var1, var2, var3

W rozmaitych skryptach wystpuj wszystkie przedstawione formy; dotyczy to zwaszcza


skryptw inicjalizacyjnych powoki.
W powoce bash mona jednym poleceniem (set -a) dokona eksportu do rodowiska wszystkich ustawionych zmiennych powoki:
$ set -a

W skryptach nie naley jednak polega na tym, e uytkownik wywoa to polecenie, i naleaoby samodzielnie eksportowa potrzebne zmienne rodowiskowe.
Dziaanie polecenia export i sposb tworzenia wasnych zmiennych rodowiskowych z uyciem tego polecenia przewiczymy na kilku kolejnych skryptach przykadowych.

sprbuj sam Eksportowanie zmiennych


Poniszy wiersz zapiszmy w pliku o nazwie echo_myvar:
echo "w skrGpcie poBomnGm MY_VAR=$MY_VAR"

Skrypt ogranicza si do wypisania wartoci zmiennej powoki o nazwie MD_VAR. Skrypt echo_
mmvar nie ustawia jednak zmiennej, polegajc na biecym stanie rodowiska. Ustawienie
powinno odby si w ramach skryptu set_mmvar, o nastpujcej treci:
] UsBawienie mG_var be. eksporBowania.
MY_VAR="TempesB"

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

185

186

Skrypty powoki. Od podstaw


echo -n "Be. eksporBu: "
sh echo_mGvar
] Tera. eksporB i ponowna prba.
echo -n "Po eksporcie: "
exporB MY_VAR
sh echo_mGvar

Test dziaania obu skryptw naley rozpocz od uruchomienia skryptu set_mmvar. Powinno
to da nastpujcy efekt:
$ sh set_myvar
Be. eksporBu: w skrGpcie poBomnGm MY_VAR=
Po eksporcie: w skrGpcie poBomnGm MY_VAR=TempesB

Jak to dziaa?
Skrypt echo_mmvar ogranicza si do wypisania wartoci zmiennej MD_VAR. Skrypt nie ustawia
wczeniej jej wartoci i polega cakowicie na zastanym stanie rodowiska. Jeli rodowisko
nie obejmuje tej zmiennej, echo_mmvar wypisze pusty cig wartoci zmiennej. W przeciwnym
razie echo_mmvar wypisze waciw warto zmiennej.
Z kolei skrypt set_mmvar ustawia zmienn MD_VAR i wywouje skrypt echo_mmvar. Jednak za
pierwszym razem ten ostatni wypisuje warto pust. To dlatego, e skrypt set_mmvar nie
utrwali zmiennej w rodowisku pki co jedynie ustawi zmienn lokaln wzgldem biecej
(swojej) powoki.
Za drugim razem skrypt set_mmvar dokonuje eksportu zmiennej MD_VAR. Teraz wywoany skrypt
echo_mmvar wypisuje waciw warto zmiennej.

Ustawianie zmiennych rodowiskowych w powoce C


Prezentowane dotd przykady ustawiania zmiennych rodowiskowych dotyczyy powoki
Bournea i zgodnych z ni w tym zakresie powok ksh i bash. W powoce C tradycyjnie ju
stosuje si odmienn skadni utrwalania zmiennych w rodowisku. Tu suy do tego polecenie wbudowane setenv. Wywouje si je nastpujco:
seBenv zmienna warto

Zauwa brak znaku rwnoci, charakterystycznego dla przypisania wartoci do zmiennej.


Znakomitym rdem przykadw obsugi zmiennych rodowiskowych w powoce C s skrypty
/etc/csh.login i /etc/csh.cshrc to systemowe pliki inicjalizacyjne dla powoki C (i tcsh).
Bdzie o nich jeszcze mowa w podrozdziale Dostosowywanie wasnego konta. Oto przykad zaczerpnity z tych plikw:
seBenv PATH "/bin:/usr/bin:/usr/local/bin:/usr//11R6/bin"
seBenv MAIL "/var/spool/mail/$USER"

W csh i tcsh nie stosuje si osobnego wywoania export.

186

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

187

Wczytywanie wartoci do biecego rodowiska


Przy uruchamianiu skryptu bieca powoka, np. bash, uruchamia powok potomn (najczciej wywoujc polecenie sh), ktra ma wykona kod skryptu. Wywoania powoki potomnej
mona unikn, uruchamiajc skrypt w rodowisku biecym. Suy do tego polecenie source.
Skadnia polecenia prezentuje si nastpujco:
source nazwa_skryptu

Polecenie source uruchamia wskazany skrypt w kontekcie biecej powoki, nie angaujc
powoki potomnej. Polecenie to jest zwykle wykorzystywane do wczytywania plikw startowych powoki.
Polecenie source jest te dostpne w postaci alternatywnej w postaci kropki:
. nazwa_skryptu

Efekt powinien by identyczny jak przy wywoaniu polecenia source.

Uruchamiana powoka odczytuje zawarto pliku inicjalizacyjnego (plikw inicjalizacyjnych),


definiujcego pierwotne rodowisko. Pliki te s same w sobie skryptami powoki. Niektre
z nich, jak /etc/profile, przechowywane s w katalogach systemowych. Wikszo uytkownikw nie ma moliwoci ich modyfikowania. Pozostae jednak znajduj si w indywidualnych katalogach domowych poszczeglnych uytkownikw. Te mona modyfikowa zgodnie
z wasnymi potrzebami.
Wszelkie pliki systemowe naley zazwyczaj pozostawi nietknite, poniewa ustalaj one
wartoci domylne waciwe dla caego systemu. W ustawienia te mog ingerowa administratorzy systemu.
Natomiast pliki przechowywane w katalogach domowych uytkownikw su wanie do dostosowywania rodowiska pracy do indywidualnych upodoba i potrzeb. Mona je uzupenia
wasnymi poleceniami (trzymajc si skadni powoki).
Kada powoka wyrnia zestaw plikw, w ktrych szuka ustawie inicjalizacyjnych. Niemal
wszystkie tego rodzaju pliki s przechowywane w katalogu domowym; nazwy wszystkich,
z jednym wyjtkiem, zaczynaj si od kropki.
Pliki o nazwach zaczynajcych si od kropki to pliki ukryte. Pliki takie nie s
ujmowane w wypisie zawartoci katalogu, o ile polecenia generujcego ten wypis
nie uzupeni si specjaln opcj; rwnie symbole wieloznaczne, jak *, nie obejmuj
plikw o takich nazwach.
Pliki inicjalizacyjne musz mie odpowiednie nazwy, inaczej powoka nie zdoa ich odnale
i wczyta. Na przykad w powoce bash jednym z plikw inicjalizacyjnych jest .bashrc. Plik

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

187

188

Skrypty powoki. Od podstaw


o dokadnie takiej nazwie powinien znajdowa si w katalogu domowym uytkownika; do
tego uytkownik musi mie prawo odczytu tego pliku.
Naleciaoci historyczne powoduj, e wikszo powok korzysta dzi z kilku plikw inicjalizacyjnych. Ich funkcje w znacznej mierze si pokrywaj, przez co dostosowania powoki bash
mona dokonywa zarwno w pliku .bash_profile, jak i .bash_login.
Nie prbuj ustawia zmiennych rodowiskowych, jeli nie znasz ich znaczenia i wpywu na
dziaanie programw. Takie prby mog zachwia stabilnoci aplikacji, ktre oczekuj
konkretnych wartoci poszczeglnych elementw rodowiska.

Procedury inicjalizacyjne poszczeglnych powok omwimy sobie w kolejnych punktach.

Rozruch powoki Bournea


Jeli powok logowania jest powoka Bournea, jej inicjalizacj steruje midzy innymi plik
przechowywany w katalogu domowym uytkownika, pod nazw .profile. Powoka wczytuje
polecenia zawarte w tym pliku, wcigajc tym samym zawarte tam ustawienia do swojego rodowiska (i rodowiska wszystkich powok potomnych).
Powoka Bournea podejmuje tak inicjalizacj tylko wtedy, kiedy zostanie uruchomiona jako
powoka logowania, to znaczy uruchomiona dla uytkownika ktry wanie zalogowa si do
systemu. Przy uruchamianiu powok potomnych plik .profile jest ignorowany.
Rozrnienie pomidzy powok logowania a pozostaymi powokami jest istotne
wanie ze wzgldu na sposb inicjalizacji powoki.

Rozruch powoki Korna


Kiedy w roli powoki logowania wystpuje powoka Korna, ustawienia pierwotne naley zapisywa w pliku .profile przechowywanym w katalogu domowym. W tym aspekcie rozruch
przebiega podobnie, jak w powoce Bournea.
Jeli ksh nie jest uruchamiana jako powoka logowania, nastpuje odczyt kodu z pliku wskazywanego zmienn rodowiskow ENV. Plik ten peni rol analogiczn do roli pliku .cshrc
w powoce C.
Jeli zmienna ENV wskazuje nie konkretny plik, a cay katalog, powoka szuka w nim pliku
o nazwie ksh_env. Jeli za ENV wskazuje konkretny plik, powoka podejmuje wczytywanie
tego pliku i uruchomienie zawartych w nim polece w kontekcie biecej powoki.

Rozruch powoki C
Kiedy powoka C uruchamia si jako powoka logowania, podejmuje odczyt polece z plikw /etc/csh.cshrc i /etc/csh.cshlogin. Nastpnie podejmuje poszukiwanie pliku o nazwie .cshrc
w katalogu domowym uytkownika i wczytuje i uruchamia polecenia zapisane w tyme pliku.

188

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

189

Do tego wszystkiego rozruch jest uzupeniany odczytem i wykonaniem polece z pliku .login
z katalogu domowego uytkownika. Z kolei przy wylogowywaniu uytkownika powoka logowania odczytuje i uruchamia zawarto pliku /etc/csh.logout i pliku .logout z katalogu domowego uytkownika.
Kiedy C startuje jako powoka potomna (nie powoka logowania), odczytuje polecenia z pliku
/etc/csh.cshrc i pliku .cshrc z katalogu domowego uytkownika.

Rozruch powoki T C
Rozruch powoki T C przebiega podobnie jak rozruch powoki C. Rnica polega na tym,
e pliki startowe mog mie nazw .cshrc albo .tcshrc. Powoka T C rozpoznaje plik .cshrc
i uwzgldnia zawarte w nim polecenia, co ma uatwi migracj do tej powoki z powoki C.

Rozruch powoki bash


Bash przy uruchamianiu wykonuje czynnoci charakterystyczne dla powok C, Bournea i Korna, korzystajc rwnie z podobnych konwencji nazewniczych plikw startowych.
Jeli powoka bash startuje jako powoka logowania, w pierwszej kolejnoci odczytuje i uruchamia polecenia z pliku /etc/profile. Nastpnie podejmuje prby odszukania i uruchomienia
szeregu plikw z katalogu domowego uytkownika:
n

.bash_profile

.bash_login

.profile

Pliki s wyszukiwane zgodnie z podan tu kolejnoci. Uruchamiany jest za pierwszy znaleziony plik. Ma to uatwi przenosiny z powoki ksh czy csh.
Przy zamykaniu powoki logowania bash szuka w katalogu domowym uytkownika pliku o nazwie .bash_logout i wykonuje zapisane w nim polecenia.
Uruchomienie powoki bash jako powoki logowania polega na wywoaniu jej z opcj --login,
jak tutaj:
$ bash --login

Aby pomin odczyt plikw startowych, naley wywoa powok bash z opcj noprofile.
Kiedy powoka bash jest uruchamiana jako powoka potomna, jej rozruch polega na przeszukaniu jednej z dwch lokacji systemu plikw. Ot jeli powoka startuje w trybie interaktywnym, szuka i uruchamia plik .bashrc z katalogu domowego uytkownika. W innych przypadkach rozruchem steruje plik wskazywany przez zmienn rodowiskow BASH_ENV. Zmienna
ta odgrywa w procesie rozruchu rol analogiczn do roli zmiennej ENV w powoce ksh.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

189

190

Skrypty powoki. Od podstaw


Opcja --norc wymusza na powoce bash zaniechanie uruchamiania pliku .bashrc. Z kolei
opcja --rcfile suy do wskazywania powoce nieinteraktywnej (i niepenicej roli powoki
logowania) pliku startowego innego ni plik .bashrc z katalogu domowego uytkownika.
Pliki sterujce rozruchem poszczeglnych powok zostay wymienione w tabeli 4.2.

Tabela 4.2. Pliki inicjalizacji (rozruchu) wybranych powok


Powoka

Rozruch

Logowanie

Wylogowanie

bash

.bashrc (dla powoki potomnej,


interaktywnej),
$BASH_ENV (dla powoki potomnej,
nieinteraktywnej)

/etc/profile, potem .bash_profile


ewentualnie .bash_login,
ewentualnie .profile

.bash_logout

csh

/etc/csh.cshrc a potem .cshrc

/etc/csh.cshrc,
potem /etc/csh.login,
potem .cshrc, potem .login

/etc/csh.logout,
potem .logout

ksh

$ENV

.profile

Brak

sh

Brak

/etc/profile, potem .profile

Brak

tcsh

/etc/csh.cshrc oraz .tcshrc


bd .cshrc

/etc/csh.cshrc, potem /etc/csh.login,


potem .tcshrc, ewentualnie .cshrc,
potem .login

/etc/csh.logout,
potem .logout

Nie naley lepo i cakowicie polega na moliwociach dostosowywania powoki do wasnych upodoba. To co prawda wietna sprawa, ale nie wolno pisa skryptw, opierajc si na indywidualnych ustawieniach rodowiska. Taki skrypt, przeniesiony do
innego systemu albo choby uruchomiony z konta innego uytkownika, moe dziaa niezgodnie z oczekiwaniami.
Poniewa inicjalizacja powoki i jej rodowiska nastpuje w ramach jej procedury rozruchowej, nie zawsze wiadomo, co powoduje rzeczony problem. Niekiedy dopiero po wielu
godzinach bezskutecznych poszukiwa wychodzi na jaw, e sam skrypt jest zupenie
w porzdku, a problem tkwi w nietypowych ustawieniach wczytanych z plikw startowych
powoki.

Kolejnym obszarem interakcji skryptw z otoczeniem jest wiersz polece. Za jego porednictwem moemy przekazywa rozmaite opcje i argumenty nie tylko do polece, ale i do
skryptw powoki. Oczywicie samo przekazanie zestawu opcji i argumentw do wywoywanego polecenia tudzie skryptu to ta prosta cz zadania. Trudniej jest obsuy tak
otrzymane wartoci we wntrzu skryptu.
W pierwszej kolejnoci naley kolejno wszystkie przekazane elementy wiersza wywoania
podda stosownej analizie.

190

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

191

Wczytywanie argumentw wywoania w powoce Bournea


Kiedy powoka Bournea uruchamia skrypt, przekazane do tego skryptu argumenty i opcje
umieszcza w specjalnych zmiennych powoki, do ktrych skrypt moe si swobodnie odwoywa. Na przykad zmienna $1 przechowuje pierwszy element wiersza wywoania (pierwszy
za nazw skryptu). Moe to by opcja (np. -v) albo argument, na przykad nazwa pliku do
przetworzenia cokolwiek to jest, skrypt moe si do tego odwoa za porednictwem $1.
Odwzorowanie kolejnoci elementw wiersza wywoania w nazwach zmiennych
(jak $1) zostao zaznaczone w nazwach tych zmiennych, okrelanych mianem
parametrw pozycyjnych.
List zmiennych specjalnych, zwizanych z obsug elementw wiersza polecenia w powoce
Bournea wymienia tabela 4.3.
Tabela 4.3. Zmienne specjalne powoki Bournea
Zmienna

Warto

$0

Nazwa skryptu podana w wierszu polecenia.

$1

Pierwszy element wiersza polecenia.

$2

Drugi element wiersza polecenia.

$3

Trzeci element wiersza polecenia.

$4

Czwarty element wiersza polecenia.

$5

Pity element wiersza polecenia.

$6

Szsty element wiersza polecenia.

$7

Sidmy element wiersza polecenia.

$8

smy element wiersza polecenia.

$9

Dziewity element wiersza polecenia.

$]

Liczba wyodrbnionych elementw wywoania.

$*

Komplet elementw wywoania w kolejnoci zgodnej z kolejnoci w wierszu polecenia


(elementy s tu oddzielone spacjami).

Nazwa skryptu, pod jak zosta wywoany, zapisywana jest w parametrze pozycyjnym $0.
Kolejne elementy wywoania s wyodrbniane do kolejnych parametrw pozycyjnych, od $1
do $9. Nie mona wprost odwoa si do elementw o numerach wikszych od 9 (np. $10).
Nie oznacza to jednak, e w wywoaniu mona przekazywa tylko dziewi opcji czy argumentw. Pozostae argumenty i opcje wywoania mona wyodrbnia z cigu $*, zawierajcego komplet elementw wywoania. Liczb tych elementw mona odczyta z $$.
Odwoania do parametrw pozycyjnych o wyszych numerach moliwe s w powoce Korna, ktra rozpoznaje i obsuguje odwoania postaci ${10} i tak dalej.
$0 nie wchodzi w skad cigu $*.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

191

192

Skrypty powoki. Od podstaw

sprbuj sam Wypisywanie argumentw wywoania


Poniszy skrypt wypisuje na wyjciu przekazane do argumenty wywoania:
] Badanie argumenBw wGwoania.
echo "SkrGpB: $0"
echo "Lic.ba elemenBw wGwoania: $]"
echo "1-s.G argumenB: $1"
echo "2-gi argumenB: $2"
echo "KompleB argumenBw: [$*]"

Zapiszmy go pod nazw args. Po uruchomieniu skryptu generowane przez niego wyjcie
bdzie zalee od przekazanych do skryptu argumentw, jak tu:
$ sh args arg1 arg2
SkrGpB: args
Lic.ba elemenBw wGwoania: 2
1-s.G argumenB: arg1
2-gi argumenB: arg2
KompleB argumenBw: [arg1 arg2]

Sprbujmy uruchomi skrypt z nieco wiksz liczb argumentw:


$ sh args arg1 2 3 4 5 6 7 8 9 10
SkrGpB: args
Lic.ba elemenBw wGwoania: 10
1-s.G argumenB: arg1
2-gi argumenB: 2
KompleB argumenBw: [arg1 2 3 4 5 6 7 8 9 10]

Jak to dziaa?
Skrypt args na pocztku wypisuje warto $0, czyli warto zmiennej przechowujcej nazw skryptu wystpujc w wywoaniu. Potem nastpuje wypisanie liczby wyodrbnionych
argumentw wywoania, a nastpnie wartoci dwch pierwszych argumentw (w osobnych
wierszach). Wreszcie w ostatnim komunikacie skrypt wypisuje w nawiasie prostoktnym kompletn list argumentw wywoania.
Zasada dziaania skryptu zdaje si nieskomplikowana, ale nie wszystko jest tak do koca oczywiste mona si o tym przekona, uruchamiajc skrypt args z odpowiednio spreparowanymi zestawami argumentw. Pierwsza prba moe polega na wywoaniu bez jakiegokolwiek
argumentu:
$ sh args
SkrGpB: args
Lic.ba elemenBw wGwoania: 0
1-s.G argumenB:
2-gi argumenB:
KompleB argumenBw: []

192

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

193

Mamy tu zerow liczb argumentw i szereg odwoa do wartoci pustych.


Jeli skrypt zostanie wywoany z jednym argumentem, wyjcie powinno prezentowa si tak:
$ sh args arg1
SkrGpB: args
Lic.ba elemenBw wGwoania: 1
1-s.G argumenB: arg1
2-gi argumenB:
KompleB argumenBw: [arg1]

Warto przechowywana jako $0 to nazwa skryptu widniejca w wierszu polecenia. Std w $0


moe zamiast waciwej nazwy pliku skryptu pojawi si rwnie dobrze pena bd wzgldna
cieka dostpu do pliku skryptu, albo jeszcze inny wariant nazwy skryptu:
$ sh /home/ericfj/beginning_shell_scripting/scripts/args arg1 arg2
SkrGpB: /home/ericfj/beginning_shell_scripBing/scripBs/args
Lic.ba elemenBw wGwoania: 2
1-s.G argumenB: arg1
2-gi argumenB: arg2
KompleB argumenBw: [arg1 arg2]

Tu w wywoaniu skryptu zosta on zidentyfikowany przez bezwzgldn ciek dostpu i w takiej te postaci jego nazwa wystpuje we wntrzu skryptu, widoczna jako $0.
W wywoaniu mog te wystpi argumenty puste, ale liczone jako osobne argumenty wywoania:
$ sh args arg1 "" "
SkrGpB: args
Lic.ba elemenBw wGwoania: 4
1-s.G argumenB: arg1
2-gi argumenB:
KompleB argumenBw: [arg1

" arg4

arg4]

Pierwszym argumentem wywoania jest tu niewyrniajcy si niczym cig arg1. Drugi argument jest jednak cigiem pustym (""). Trzeci argument to z kolei cig niepusty, ale zawierajcy
wycznie znaki spacji; wreszcie czwarty argument znw jest najzwyklejszym cigiem, niepustym i zoonym z widocznych znakw arg4.
Kiedy w skrypcie nastpuje odwoanie $*, ujte pomidzy znakami cudzysowu (jak w skrypcie
args, gdzie odwoanie $* zostao osadzone w cigu tekstowym), powstaje cig obejmujcy
rwnie spacje skadajce si na cig argumentu trzeciego ($3).
Poniewa spacja peni rol separatora elementw w cigu $*, a argumenty mog zawiera spacje
albo nawet w caoci skada si tylko ze spacji, odwoania mog by niekiedy mylce:
$ sh args "1 2 3 4 5 6 7 8 9"
SkrGpB: args
Lic.ba elemenBw wGwoania: 1
1-s.G argumenB: 1 2 3 4 5 6 7 8 9
2-gi argumenB:
KompleB argumenBw: [1 2 3 4 5 6 7 8 9]

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

193

194

Skrypty powoki. Od podstaw


Do skryptu przekazalimy jeden tylko argument ("1 2 3 4 5 6 7 8 9"), ale z racji spacji
pomidzy znakami w cigu argumentu, kiedy skrypt args wypisuje warto $*, mona omykowo uzna, e do skryptu przekazano a 9 argumentw.
Jak wida, przy manipulowaniu argumentami wywoania skryptu naley zachowa pewn
ostrono.
Obsuga argumentw wiersza polecenia jest szczeglnie uciliwa w systemach
Windows i Mac OS X, gdzie czsto stosuje si nazwy katalogw zawierajcych
spacje (jak choby w nazwie C:\Program Files).
Jak dotd ograniczalimy obsug argumentw wywoania do wypisywania ich na wyjciu
skryptu. Sprbujmy teraz zrobi z nich lepszy uytek.

sprbuj sam Uywanie argumentw wywoania


Skryptem mmls, prezentowanym w rozdziale 3., naladowalimy dziaanie polecenia ls. Skrypt
ten moemy teraz rozbudowa o moliwo przekazywania w wywoaniu nazwy katalogu
do przejrzenia. Zapiszmy now wersj skryptu pod nazw mmls3:
] ZakadamG, e $1 (pierws.G argumenB wGwoania)
] wska.uje kaBalog do pr.es.ukania.
cd $1
for filename in *
do
echo $filename
done

Po uruchomieniu skryptu bdzie mona si przekona, e zawarto wypisywanej na wyjciu listy nazw plikw jest uzaleniona od argumentu wywoania, okrelajcego nazw katalogu:
$ sh myls3 /usr/local
bin
eBc
games
include
lib
libexec
man
sbin
share
src

Jak to dziaa?
Skrypt mmls3 uzupenia pierwowzr z rozdziau 3. o obsug wiersza polecenia pierwszy
argument wywoania jest tu uznawany za nazw katalogu, w ktrym naley wyszuka pliki
do wypisania. Realizacja postulatu wyraonego wywoaniem odbywa si przez przejcie do
wskazanego katalogu poleceniem cd i podjcie zwykej ptli wypisujcej nazwy plikw z biecego katalogu.

194

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

195

W ten sposb mona za porednictwem argumentw wywoania wskazywa katalogi i pliki


wyznaczone do przetwarzania w skrypcie powoki.

Wczytywanie argumentw wywoania w powoce C


W powokach C i T C do obsugi argumentw wywoania rwnie stosuje si specjalne
zmienne, podobnie jak w powokach sh, bash i ksh. Tyle e w powokach csh i tcsh w miejsce
$$ stosuje si odwoanie $$argv.
W csh i tcsh specjalna zmienna $$argv przechowuje liczb argumentw wywoania skryptu.
Trzeba zaznaczy, e tcsh rozpoznaje te odwoanie postaci $# i mona tam stosowa
zarwno zapis $#, jak i $#argv.

Jak dotd uruchamianie skryptw wymagao od nas jawnego wywoywania powoki (sh)
z nazw skryptu przeznaczonego do uruchomienia. Nie przypomina to bynajmniej wywoa
zwykych polece, jak choby ls. W przypadku samodzielnych polece wywoanie sprowadza si do podania nazwy polecenia.
Rzecz jasna istnieje sposb, ktry pozwala zamieni nasz niepenowartociowy w tym sensie skrypt na penowartociowe polecenie wykonywalne tak, aby uytkownicy wywoywali go, wpisujc jego nazw w wierszu polecenia, i nawet nie domylali si, e to skrypt
powoki, a nie program wykonywalny.
Transformacja owa skada si z dwch etapw:
n

oznaczenia pliku skryptu jako pliku wykonywalnego;

uzupenienia kodu skryptu o specjalny wiersz identyfikujcy powok majc


uruchomi skrypt.

Etapom tym przyjrzymy si w osobnych punktach.

Nadawanie skryptowi atrybutu wykonywalnoci


W systemach uniksowych i uniksopodobnych wszystkie skrypty powoki, polecenia, programy
binarne i w ogle wszystkie pliki, ktre da si uruchomi, powinny by oznaczone jako pliki
wykonywalne. Plik wykonywalny to plik posiadajcy atrybut uprawniajcy uytkownika do
jego uruchamiania. Uprawnienia pliku modyfikuje si poleceniem chmod.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

195

196

Skrypty powoki. Od podstaw


Zanim przystpisz do zmiany zestawu uprawnie, powiniene jednak sprawdzi, jakie uprawnienia definiuje plik obecnie. Wykaz uprawnie mona wypisa poleceniem ls, wywoanym
z opcj -l, jak tu:
$ ls -l myls3
-rw-rw-r-- 1 ericfj engineering 124 OcB 12 22:39 mGls3

Kada trjka symboli (np. rw-) reprezentuje uprawnienia pewnej kategorii uytkownikw.
Pierwsza dotyczy uytkownika bdcego wacicielem pliku (tu jest nim ericfj i dotycz
go uprawnienia rw-), druga obejmuje uytkownikw grupy skojarzonej z plikiem (tu engineering, z uprawnieniami rw-), trzecia za dotyczy caej reszty uytkownikw (tu maj oni
uprawnienia r--). Symbol r w tej trjce oznacza moliwo odczytu pliku. Symbol w oznacza uprawnienia do zapisywania (modyfikacji) pliku. A mylnik oznacza brak uprawnie.
Trjka rw- oznacza wic uprawnienia do odczytu i zapisu pliku, a r-- to uprawnienia wycznie do odczytu. Jak wida, ten plik nie definiuje w ogle uprawnie do uruchamiania.
Dodanie takich uprawnie wymaga wywoania polecenia chmod. Oto przykad:
$ chmod u+x myls3

Argument w postaci u+x to jeden z moliwych sposobw wyraenia chci modyfikacji zestawu
uprawnie. Znak u oznacza tu uytkownika, a konkretnie waciciela pliku. Znak + oznacza
uzupenienie zestawu uprawnie, a x to symbol uprawnienia do uruchamiania.
Uprawnienia mona te podawa w specjalnym zapisie semkowym, np. 0666.
Po szczegy odsyamy do dokumentacji systemowej dla polecenia chmod.
Sprawdmy poleceniem ls, czy faktycznie skrypt zyska uprawnienie do uruchamiania:
$ ls -l myls3
-rwxrw-r-- 1 ericfj engineering 124 OcB 12 22:39 mGls3

Jak wida, waciciel pliku ma teraz komplet uprawnie (rwx), a wic prawo do odczytywania,
zapisywania i uruchamiania pliku. Plik skryptu sta si niniejszym plikiem wykonywalnym
(cho na razie tylko dla jego waciciela).
Uytkownicy powoki csh czy te tcsh powinni po takiej zmianie uprawnie wywoa polecenie rehash, odwieajce wewntrzn list plikw wykonywalnych:
$ rehash

Po oznaczeniu skryptu atrybutem wykonywalnoci naley jeszcze podpowiedzie powoce


(i wszelkim innym powokom), w jaki sposb ma dokona uruchomienia skryptu.

Magiczny wiersz #!
Pliki wykonywalne czyli, oglnie mwic, polecenia pochodz z wielu rde i maj
najrniejsze postaci. Wikszo polece to programy skompilowane, binarne. S one pisane
w jzyku programowania C i potem kompilowane do postaci wykonywalnej, odpowiedniej
dla procesora waciwego dla danej platformy.

196

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

197

Polecenia mona by z grubsza podzieli na:


n

skompilowane, wykonywalne (bezporednio) programy binarne,

archiwa wykonywalne jzyka Java (plik .jar),

skrypty w jzykach takich jak Python, Perl, Tcl, Ruby czy Lua,

skrypty powoki.

Przy prbie uruchomienia pliku wykonywalnego powoka przede wszystkim prbuje okreli
typ pliku i na jego podstawie zastosowa odpowiedni metod wywoania. Jeli na przykad
plik jest skompilowanym, wykonywalnym plikiem binarnym, powoka odczytuje z niego pierwszych kilka bajtw, zawierajcych specjalny kod (znany te jako liczba magiczna pliku
od pliku /etc/magic, zawierajcego list znanych kodw). Ten kod determinuje sposb uruchomienia pliku.
Taka sama procedura dotyczy rwnie skryptw powoki. Powoka musi w pierwszej kolejnoci
wykry, e dany plik wykonywalny jest skryptem. Jest to o tyle proste, e wszelkie skrypty
s zwykymi plikami tekstowymi, wic bajty pliku zawieraj kody znakw drukowalnych.
Kiedy ju powoka stwierdzi, e ma do czynienia ze skryptem, powinna znale odpowiedni
sposb jego uruchomienia sowem, wybra program, ktry ma zaj si interpretacj i wykonywaniem polece zapisanych w skrypcie. Jeli na przykad w systemie dziaa powoka
bash, a skrypt jest przeznaczony dla powoki sh, powoka bash powinna wybra i wywoa
program powoki sh i przekaza mu zadanie uruchomienia skryptu.
Przyjo si, e jeli skrypt zaczyna si od wiersza ze znakami $!, to w specjalny komentarz
wskazuje program interpretera waciwego dla skryptu. Z poniszego wynikaoby wic, e
skrypt ma zosta uruchomiony w powoce sh:
]!/bin/sh

Trzeba przy tym pamita, e w specjalny wiersz musi by pierwszym wierszem pliku. A znak
$ musi by pierwszym znakiem pierwszego wiersza. Jeli z jakichkolwiek przyczyn specjalne
znaczenie takiego wiersza bdzie nieznane dla powoki, w ktrej nastpi wywoanie pliku
skryptu, powoka ta zignoruje wiersz cakowicie wszak $ jest poza tym wyjtkiem zapowiedzi komentarza.
Skadnia wiersza $! prezentuje si nastpujco:
]!/pena/cieka/do/interpretera

Interpreter to program podejmujcy interpretacj poszczeglnych polece skryptu i uruchamiajcy te polecenia. Dla skryptw powoki Bournea interpreterem jest sh (instalowany jako
/bin/sh). Interpreterami skryptw powoki s same powoki. Nie jest to regu w przypadku
innych jzykw skryptowych choby w jzyku Tcl interpreter moe by rwnoczenie
namiastk powoki (tclsh) albo interpreterem z obsug trybu graficznego (wish).
Podsumowujc, powoka obsugujca wywoanie skryptu analizuje wiersz $! i wywouje wymieniony tam program interpretera.
List konwencjonalnych lokalizacji instalacji interpreterw i powok wymienia tabela 4.4.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

197

198

Skrypty powoki. Od podstaw

Tabela 4.4. Typowa lokalizacja plikw powok i interpreterw jzykw skryptowych


Interpreter (powoka)

Wiersz #!

ash

]!/bin/ash

bash

]!/bin/bash

csh

]!/bin/csh

ksh

]!/bin/ksh

perl

]!/usr/bin/perl ewentualnie ]!/usr/local/bin/perl

python

]!/usr/bin/pGBhon ewentualnie ]!/usr/local/bin/pGBhon

sh

]!/bin/sh

tclsh (Tcl)

]!/usr/bin/Bclsh ewentualnie ]!/usr/local/bin/Bclsh

tcsh

]!/bin/Bcsh ewentualnie ]!/usr/local/bin/Bclsh

wish (Tcl)

]!/usr/bin/wish ewentualnie ]!/usr/local/bin/wish

zsh

]!/bin/.sh

Identyczny mechanizm wykorzystywany jest rwnie w skryptach jzykw skryptowych,


takich jak Perl czy Python. Na przykad skrypt jzyka Perl zaczynaby si od wiersza:
]!/usr/bin/perl

Istnieje jednak problem w postaci ryzyka niedostpnoci wskazanego interpretera w danym


systemie, albo dostpnoci w innej lokalizacji. Jeli dany interpreter nie wchodzi w skad standardowej dystrybucji danego systemu, to jeli zostanie zainstalowany dodatkowo, bdzie znajdowa si najprawdopodobniej w katalogu /usr/local/bin (albo jeszcze innym), ale nie w /bin
czy /usr/bin. Z kolei w systemie Linux niemal wszystkie istniejce pakiety stanowi cz
danej dystrybucji (cho niekoniecznie s instalowane domylnie) i niemal zawsze s instalowane w katalogach /bin bd /usr/bin. Std cieka wystpujca w wierszu $! nie wszdzie
wskazuje istniejcy program interpretera.

sprbuj sam Usamodzielnianie skryptu


Poczwszy od omawianego poprzednio skryptu mmls3 zaczniemy tworzy skrypty nadajce si
do samodzielnego wywoywania, a to za spraw wiersza $! wskazujcego interpreter waciwy
dla uruchomienia skryptu. Zapiszmy niniejszym uzupeniony skrypt pod nazw mmls4:
#!/bin/sh
] ZakadamG, e $1 (pierws.G argumenB wGwoania)
] wska.uje kaBalog do pr.es.ukania.
cd $1
for filename in *
do
echo $filename
done

198

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

Rozdzia 4. n Interakcja ze rodowiskiem skryptu

199

Waciwy kod skryptu nie rni si niczym od kodu ze skryptu mmls3, rnica ogranicza si
wic do pierwszego wiersza (ktry zosta tu wyrniony pogrubieniem czcionki). Mona wic
z powodzeniem skopiowa kod ze skryptu mmls3.
Teraz trzeba jeszcze oznaczy skrypt atrybutem wykonywalnoci:
$ chmod u+x myls4

W powokach C i T C, po umieszczeniu w ktrym z katalogw cieki przeszukiwania nowego


pliku wykonywalnego, naley jeszcze odwiey wewntrzn list polece wykonywalnych,
przechowywan przez powok. Suy do tego polecenie rehash:
$ rehash

Po wywoaniu polecenia chmod (i ewentualnie rehash) mona ju uruchamia skrypt jako samodzielne polecenie w biecym katalogu:
$ ./myls4 /usr/local
bin
eBc
games
include
lib
libexec
man
sbin
share
src

Efekt powinien by taki sam jak po analogicznym uruchomieniu polecenia mmls3.

Jak to dziaa?
Opatrzenie skryptu atrybutem wykonywalnoci i uzupenienie go o wiersz $! pozwala na
uruchamianie skryptu jako samodzielnego polecenia. Zapis ./mmls4 z poprzedniego przykadu
informuje powok, aby wyszukaa plik wykonywalny myls4 w katalogu biecym.
Jeli w katalog biecy wchodzi w skad cieki przeszukiwania, mona wywoa skrypt
mmls4 jeszcze prociej:
$ myls4
bin
eBc
games
include
lib
libexec
man
sbin
share
src

Wygod t mona te osign, kopiujc plik skryptu do jednego z katalogw wchodzcych


w skad cieki przeszukiwania (czyli do jednego z katalogw wymienionych w cigu zmiennej
rodowiskowej PATH). W ten wanie sposb mona uzupenia system o wasne polecenia.

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

199

200

Skrypty powoki. Od podstaw

Skrypty powoki nie s bytami niezalenymi od reszty elementw systemu, a w szczeglnoci


musz dziaa z uwzgldnieniem otoczenia, czyli rodowiska. Tym samym pozwalaj na odwoywanie si do tego rodowiska uytkownikowi.
W tym rozdziale udao si omwi:
n

Zmienne rodowiskowe, przechowujce ustawienia poszczeglnych elementw


rodowiska systemowego. Do tych ustawie zaliczamy wartoci odzwierciedlajce
rodzaj i typ platformy, pooenie katalogw polece oraz ustawienia indywidualne
dla uytkownikw, na przykad wskazania domylnej powoki i katalogu domowego
uytkownika.

Zmienne rodowiskowe s zwykymi zmiennymi powoki. Mona si do nich


odwoywa za porednictwem nazwy uzupenionej (z przodu) znakiem $. Ale
ustawienie zmiennej rodowiskowej, aby na trwale weszo do rodowiska, musi
zosta uzupenione operacj eksportu zmiennej.

Wszystkie dane umieszczane w wierszu polecenia, w tym opcje i argumenty


wywoania skryptu, s w nim dostpne za porednictwem specjalnych zmiennych
zwanych parametrami pozycyjnymi ($1, $2 itd.). Mona z nich robi dowolny uytek
we wntrzu skryptu.

Aby skrypt powoki sta si samodzielnym poleceniem, trzeba oznaczy plik skryptu
atrybutem wykonywalnoci i umieci w pierwszym wierszu skryptu specjalny zapis
$!, wskazujcy program interpretera waciwy do wykonania skryptu.

W nastpnym rozdziale zajmiemy si plikami wszak znakomita wikszo skryptw powoki w ten czy inny sposb odwouje si do plikw zewntrznych.

1. Napisz skrypt, ktry w obliczu braku zmiennej SHELL informuje o tym uytkownika

i koczy dziaanie. Dziaanie skryptu przetestuj w obu moliwych przypadkach: przy


ustawionej i nieustawionej zmiennej SHELL.
2. Napisz skrypt, ktry przegldajc kolejne argumenty wywoania, bdzie je wypisywa

na wyjciu. Skrypt ma dziaa poprawnie niezalenie od liczby argumentw wywoania


i wypisywa jedynie te z nich, ktre maj niepuste wartoci. Na przykad argument
"", cho przekazany do skryptu, jako pusty nie powinien by wypisywany na wyjciu.
Skrypt powinien ponadto wypisywa czn liczb argumentw wywoania.
3. Napisz skrypt, ktry wypisywaby wszystkie przekazane do argumenty, ale taki,

ktry dziaaby bez modyfikacji w powokach bash, ksh, sh i csh (uwaga: najtrudniej
uzyska zgodno z powok C).
4. Napisz skrypt, ktry przyjmuje za porednictwem argumentw wywoania dowoln

liczb nazw katalogw i wypisuje zawarto kadego z tych katalogw. Wypis


zawartoci kolejnego katalogu powinien by poprzedzony jego nazw.

200

D:\! AAA DZISIAJ\Skrypty powoki. Od podstaw\07 druk\r04-06.doc

You might also like