Professional Documents
Culture Documents
Skrypty Powłoki. Od Podstaw
Skrypty Powłoki. Od Podstaw
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
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
Spis treci
Spis treci
Spis treci
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
169
170
170
171
Znaczenie
COLUMNS
DISPLAY
Nazwa ekranu docelowego dla programw korzystajcych z usug serwera X Window System.
HISTSIZE
HOME
HOSTNAME
LANG
LINES
PATH
PWD
SHELL
TERM
Typ terminala.
USER
171
172
172
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.
173
174
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.
174
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).
175
176
176
177
Rzecz jasna, w systemie innym ni testowy uzyskany wykaz moe si rni od powyszego.
177
178
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
_=
178
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
179
180
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
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
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.
181
182
]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
183
"DISPLAY=$DISPLAY"
"SHELL=$SHELL"
"USER=$USER"
"HOME=$HOME"
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.
183
184
Ustawienie zmiennej rodowiskowej wymaga operacji eksportowania. Samo ustawienie zmiennej odbywa si przy uyciu zwykej skadni przypisania wartoci do zmiennej:
184
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
Oba polecenia mona czy do postaci pojedynczego wiersza polecenia wystarczy skorzysta ze rednika:
var=value; exporB var
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.
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"
185
186
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.
186
187
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
187
188
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
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.
.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.
189
190
Rozruch
Logowanie
Wylogowanie
bash
.bash_logout
csh
/etc/csh.cshrc,
potem /etc/csh.login,
potem .cshrc, potem .login
/etc/csh.logout,
potem .logout
ksh
$ENV
.profile
Brak
sh
Brak
Brak
tcsh
/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
191
Warto
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
$]
$*
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 $*.
191
192
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]
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
193
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]
193
194
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
195
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
195
196
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
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
197
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.
197
198
Wiersz #!
ash
]!/bin/ash
bash
]!/bin/bash
csh
]!/bin/csh
ksh
]!/bin/ksh
perl
python
sh
]!/bin/sh
tclsh (Tcl)
tcsh
wish (Tcl)
zsh
]!/bin/.sh
198
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
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
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
199
200
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
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
200