ALIASY I SKRYPTY id 57877 Nieznany (2)

background image

1

ALIASY I SKRYPTY

Skrypty są już znane z DOS-a. Były to pliki z rozszerzeniem .bat. W Linuksie (UNIXI-ie) skrypt jest plikiem tekstowym zawierającym
polecenia (programy) systemowe oraz polecenia sterujące przebiegiem wykonania samego skryptu.

Istnieją dwa rodzaje plików wykonywalnych: skrypty i pliki binarne. Skrypty przeznaczone są do wykonania przez powłokę. Pliki binarne
(przeznaczone do wykonania przez CPU) są wynikiem kompilacji tekstu źródłowego programu napisanego w wybranym języku
programowania.

Skrypty mają nie tylko zapewnić komfort automatyzacji, systematycznie powtarzanych rutynowych czynności. Ich zastosowanie jest
znacznie poważniejsze. Siła wszystkich systemów uniksowych jest w dużym stopniu oparta właśnie na elastyczności i szerokim zakresie
stosowania skryptów.

Automatyzację czynności w prostym (i ograniczonym zakresie) można uzyskać za pomocą aliasów.

Przykładowo, jeżeli często montujemy i demontujemy CD-ROM-y, możemy zdefiniować dwa aliasy jeden do montowania, a drugi do
demontowania:

# alias cdm="mount -t iso9660 -o ro /dev/hdc /mnt/cdrom"
# alias cdu="umount /mnt/cdrom"
Teraz root może zamontować CD-ROM jednym krotkim poleceniem:
# cdm
i zdemontować
# cdu
Alias może być używany tylko przez tego użytkownika, który go zdefiniował. Definicje aliasów zachowują swoją ważność tylko do
zakończenia danej sesji użytkownika. Po ponownym zalogowaniu musimy aliasy zdefiniować na nowo. Jest to kłopotliwe i nie ma nic
wspólnego z wygodą. Aby utrzymać aliasy cały czas aktualne, musimy wpisać je do odpowiedniego pliku startowego bash-a. W naszym
przypadku będzie to plik ukryty (nazwa zaczynająca się od kropki) .bashrc. Każdy użytkownik ma taki indywidualny plik w jego katalogu
domowym. Dla administratora będzie to plik /root/.bashrc. Dla użytkownika crash1 plik /home/crash1/.bashrc

Sprawdzamy dostępne aliasy

Wydanie polecenia alias bez opcji i argumentów spowoduje wyświetlenie listy zdefiniowanych aliasów.
# alias
alias cdm='mount -t iso9660 -o ro /dev/hdc /mnt/cdrom'
alias cdu='umount /mnt/cdrom'
alias cp='cd -i'
alias mv='mv -i'
alias rm='rm -i'
alias which='type -patch'
[root@linux /root]# _
Dwa pierwsze aliasy zdefiniowaliśmy sami. Pozostałe są efektem domyślnej konfiguracji systemu.

Bardziej rozbudowany alias

Za pomocą aliasu możemy zrealizować bardziej złożone zadania niż te opisane wcześniej. W definicji aliasu możemy wykorzystać istniejący
już alias (np. cdm). Ponadto powinniśmy wiedzieć, że polecenia systemowy możemy zapisać w "jednej lini", oddzielając średnikiem (;). W
takim przypadku alias jest często tasiemcowo długi, z reguły dłuższy niż jeden wiersz. W czasie wprowadzania aliasu w wierszu poleceń
systemowych bash powinien automatycznie przejść do nowej linii. Jak powinniśmy pamiętać, możemy również wymusić przejście do
nowego wiersza, bez zamykania polecenia, korzystając z maskującej klawisz [Enter] właściwości "\". To może mieć zastosowanie przy
korzystaniu z edytora do wpisania aliasu do pliku .bashrc
Na początek sprawdźmy maskujące działanie "/", wydając proste polecenie wylistowania katalogu głównego (ls /), ale zapisane w dwu
wierszach:
# ls \ [Enter]

> / [Enter]
bin etc lost+found root usr
boot home mnt sbin var
dev lib proc tmp
[root@linux /root]# _
Aby pierwsze naciśnięcie klawisza [Enter] zostało zamaskowane, nie wolno na za "\" wprowadzać żadnych znaków. Bezpośrednio po
wprowadzeniu "\" naciskamy [Enter], przechodząc w ten sposób do nowego wiersza i kontynuując wprowadzanie polecenia. Widoczny na
początku drugiego wiersza znak ">" jest generowany przez bash. Informuje on, że kontynuujemy wprowadzanie rozpoczęte w poprzednim
wierszu (wierszach).
Zdefiniujmy teraz alias kopia realizujący następującą sekwencję działań:

1. Montuje CD-ROM, korzystając z aliasu cdm
2. Zakłada na dyskietce dosowy system plików
3. Sprawdza

powierzchnię dyskietki (badblocks

4. Kopiuje na dyskietkę plik /etc/passwd
5. Wyświetla zawartość dyskietki.

background image

2

#
> ;mbadblocks a:;mcopy /etc/passwd a:;mdir a:" [Enter]

alias kopia="cdm;mformat -t 80 -h 2 -s 18 a:\[Enter]

[root@linux /root]# _

Zapis a: oznacza napęd dyskietek. Kolejne polecenia są oddzielone od siebie średnikami. Możemy teraz wydać polecenie alias, aby
wylistować dostępne aliasy i sprawdzić, czy prawidłowo zdefiniowaliśmy alias kopia
Wkładamy do czytnika CD-ROM, a do napędu dyskietkę i wydajemy polecenie kopia:
# kopa
Volume in drive A: has no label
Volume Serial Number is 2432-5764
Directory for A:/

passwd 632 04-01-2000 19:37 passwd
1 file 632 bytes
1 456 640 bytes free
[root@linux /root]# _

Możemy sprawdzić jeszcze (df), czy CD-ROM rzeczywiście został zamontowany. W powyższym przykładzie montowanie CD-ROM-u nie
ma oczywiście żadnego logicznego związku z pozostałymi działaniami. Ma być tylko przykładem.

Wpisujemy alias do pliku .bashrc

Zalogujmy się jako crash1 i sprawdźmy, jakie (domyślne) aliasy mamy do dyspozycji:
$ alias
alias which='type -path'

[crash1@linux crash1]$ _

Zdefiniujemy trwały (przez wpisanie do pliku .bashrc) alias ll=ls -l. Zrobimy to za pomocą edytora vi. Na początek obejrzyjmy plik .bashrc
$ cat .bashrc
# .bashrc

# User specyfic aliases and functions

#Sourace global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
Definicję naszego aliasu wprowadzimy w czwartym wierszu pliku. Przed modyfikacją pliku sporządzimy kopię bezpieczeństwa
(.bashrc_old):
$ cp .bashrc .bashrc_old
[crash1@linux crash1]$ vi .bashrc
[Esc], [j], [j], [j], [a], alias ll="ls -l", [Esc], :wq , [Enter]
...
...
".bashrc" 8 lines, 140 characters written

[crash1@linux crash1]$ alias
alias which='type -path'

[crash1@linux crash1]$ logout
Red Hat Linux relase 5.2 (Apollo)
Kernel 2.0.36 on an i586

linux login: crash1
Password:
Last login: Tue Apr 1 16:43:34 on tty1

[crash1@linux crash1]$ alias
alias ll='ls -l'
alias which='type -path'

[crash1@linux crash1]$ ll .bashrc
-rw-r--r-- 1 crash1 crash1 11 Apr 1 16:50 .bashrc
[crash1@linux crash1]$ _

Zwróćmy uwagę na prawa dostępu do pliku .bashrc. Prawo pisania posiada tylko właściciel (i root) i tak powinno pozostać. Aliasy są
wygodnym narzędziem do zdefiniowania środowiska pracy. A oto kilka popularnych aliasów:
la='l -a'
rd='rmdir'
md='mkdir'
ls='ls -F'

Usuwamy aliasy

Definicje aliasów usuwamy poleceniem unalias. Oczywiście, jeżeli definicje aliasów wpisane są do pliku .bashrc, usunięcie będzie ważne
jedynie do końca bieżącej sesji użytkownika:
$ alias
alias ll='ls -l'
alias which='type -patch'

[crash1@linux crash1]$ unalias ll

[crash1@linux crash1]$ alias

background image

3

alias which='type -patch'

[crash1@linux crash1]$ _

Ponieważ alias ll jest wpisany do pliku .bashrc, po ponownym zalogowaniu będzie dostępny.

Pierwszy skrypt

Skrypty tworzymy przez wpisanie poleceń do pliku tekstowego. Robimy to za pomocą dowolnego edytora. Możliwość tworzenia skryptów
jest silną stroną Linuksa.
Pierwszy skrypt będzie automatycznie montował CD-ROM, odczytywał liczbę 1024 kilobajtowych bloków (pojemność CD-ROM-u), podawał
tę informację na ekran, a następnie demontował CD-ROM.
Zalogujmy się jako root i za pomocą edytora vi utworzymy w katalogu bieżącym plik tekstowy o nazwie cdbl i treści:
#!/bin/bash
# zamontowanie CD-ROM
mount -t iso9660 -o ro /dev/hdc /mnt/cdrom
#wpisanie do pliku liczbabl ilosci blokow
df | grep "/mnt/cdrom" | cut -c31-36 > liczbabl
#podanie wyniku na ekran
echo "Liczba blokow na CD-ROM-ie wynosci: " 'cat liczbabl'
#zrobienie porzadkow
rm liczbapl
umount /mnt/cdrom

Większość poleceń jest tu znana, występują tylko dwa nowe cut i echo. Wiersze zaczynające się od znaku hasz "#" są liniami komentarza,
czyli w trakcie wykonywania skryptu będą pomijane przez interpreter (powłokę). W szczególności pierwsza linia skryptu jest linią
komentarza, ale ponieważ zaczyna się ciągiem dwóch znaków "#!" ma znaczenie szczególne - wskazuje na rodzaj powłoki, w jakim ma być
uruchomiony skrypt. Za znakami "#!" występuje pełna ścieżka dostępu do żądanej powłoki. Jeżeli ścieżka ta jest błędna bądź wskazana
powłoka nie występuje w naszym systemie skrypt nie będzie mógł być uruchomiony.
W pierwszym znaku akcji montujemy CD-ROM. W następnym wierszy tworzymy potok, który z rezultatu polecenia df wybiera wiersz
dotyczący CD-ROM-u a następnie z tego wiersza wycina (cut) łańcuch sześciu kolejnych znaków (-c31-36) od znaki 31 do 36 włącznie.
Ten łańcuch znaków to sześciocyfrowa liczba bloków. Łańcuch jest wpisywany do świeżo tworzonego pliku liczbabl. W trzecim wierszu
wyprowadzamy rezultat na ekran. Służy do tego celu polecenie echo.
Utworzony plik tekstowy cdbl musimy uczynić wykonywalnym, czyli nadać mu prawo wykonywania oraz skopiować go do katalogu
dostępnego w ścieżkach przeszukiwania określonych w zmiennej PATH. Będzie to podkatalog bin w katalogu domowym root-a. Jeżeli nasz
plik wykonywalny nie będzie znajdował się w którymś ze wskazanych przez PATH katalogów, to chcąc go uruchomić musimy podać pełną
ścieżkę dostępu do niego.
# ls -l cdbl
-rw-r--r-- 1 root root 307 May 26 14:23 cdbl

[root@linux /root]# chmod 755 cdbl
[root@linux /root]# ls -l cdbl
-rwxr-xr-x 1 root root 307 May 26 14:23 cdbl

[root@linux /root]# mkdir bin

[root@linux /root]# cp cdbl /root/bin
[root@linux /root]# which cdbl
/root/bin/cdbl
[root@linux /root]# _

Polecenie which wskazuje pełną ścieżkę dostępu do pliku wykonywalnego, który zostanie uruchomiony po wydaniu prostego polecenia
zawierającego tylko nazwę tego pliku.
Teraz możemy już sprawdzić działanie naszego skryptu. Włóżmy CD-ROM do czytnika i wydajmy nasze nowe polecenie:
# cdbl
Liczba blokow na CD-ROM-ie wynosi: 570782

[root@linux /root]# _
Ktoś kto napisał kilka skryptów pod DOS-a, na pewno korzystał z przekazywania parametrów do skryptu. Podobny mechanizm znajdziemy
także w Linuksie. Wykonajmy przykładowy skrypt, który będzie z niego korzystał. Zalogujmy się w tym celu jako crash1. Nasz skrypt będzie
zmieniał nazwę wskazanego pliku (pierwszy argument) na nową wskazaną przez nas ((drugi argument), ale jednocześnie utworzy kopię
zapasową tego pliku pod starą nazwą z przyrostkiem .old. Jeżeli nowa nazwa nie zostanie podana, domyślnie zostanie przyjęta nazwa
nowy. Nasz skrypt będzie się nazywał zmk i wyglądał tak:
#!/bin/bash
#czy podany jest pierwszy argument
if
[ -z "$1" ]

then
echo "zmk: uzywaj: zmk stara_nazwa [nowa_nazwa]"
exit 1
fi
#czy istnieje plik źródłowy (stara nazwa)
if
[ ! -f $1]
then
echo zmk: Plik zrodlowy nie jest dostepny
exit 1
fi
#czy mamy prawo pisania do biezacego katalogu
if

[ ! -w . ]
then

background image

4

echo zmk: Nie mamy prawa pisania do biezacego katalogu
exit 1
fi
#czy podany jest drugi argument (nowa nazwa)
if
[ -z "#2" ]
then

cp $1 $1.old
mv $1 nowy
echo "zmk: Przyjeto domyslna nazwe 'nowy'"
exit 0
fi
#gdy drugi argument jest podany
cp $1 $1.old
mv $1 $2
exit 0
Składnia użycie tego skryptu jest następująca:

zmk stara_nazwa nowa_nazwa
Drugi argumnet (nowa_nazwa) jest opcjonalny. Jeżeli nie wystąpi, przyjmowana jest domyślna nazwa nowy.
Objaśnienie nowych konstrukcji i poleceń:
Parametry przekazywane do skryptu przypisywane są zmiennym od $0 do $9, przy czym $0 zawiera nazwę skryptu (polecenia), $1
odpowiada pierwszemu argumentowi polecenia, $2 odpowiada drugiemu polecenia, itd. Należy przy tym zaznaczyć, że zmienne $0 do $9
należą do grupy zmiennych specjalnych powłoki.
Następnie widzimy tu konstrukcję if-then kończoną przez fi (co odpowiada znanej ENDIF). Występujące tu polecenie exit, powodujące
opuszczenie skryptu z określonym kodem powrotu. W naszym skrypcie przyjeliśmy zero przy prawidłowym zakończeniu skryptu oraz jeden
przy błędzie. Jeżeli kod powrotu nie jest podany jawnie, polecenie exit przyjmuje kod domyślny (zero). Zwykle polecenia systemowe
zwracają wartość zero, kiedy ich wykonanie zakończy się powodzeniem i wartość różną od zera (z reguły 1 alvo -1), gdy wykonanie
zakończy się niepowodzeniem. Wartość ta umieszczana jest w zmiennej specjalnej $? (zawierającej kod powrotu ostatniego polecenia).
Konstrukcja w nawiasach kwadratowych to sposób zapisu polecenia test. Polecenie test jest szeroko stosowane w skryptach shellowych.
Postać polecenia test jest następująca:
test warunek
Polecenie to może być zapisane wpostaci nawiasów kwadratowych:
[warunek]
Polecenie test zwraca wartość zero (prawda), gdy warunek jest spełniony i wartość jeden (fałsz), gdy jest nie spełniony. Wartość ta
umieszczona jest w zmiennej $?.
Zapis w nawiasach kwadratowych jest najczęściej stosowany w skryptach z uwagi na większą czytelność. Wymieńmy wybrane warunki:
[ -d plik ] - plik istnieje i jest katalogiem
[ -f plik ] - plik istnieje i plikiem zwykłym
[ -r plik ] - plik istnieje i mamy do niego prawo czytania
[ -w plik ] - plik istnieje i mamy do niego prawo pisania
[ -x plik ] - plik istnieje i mamy do niego prawo wykonywania
[ -s plik ] - plik istnieje i mam rozmiar większy niż zero bajtów

[ -z s1 ] - długość łańcucha s1 jest zerowa
[ -n s1 ] - długość łańcucha s1 nie jest zerowa
[ s1 = s2 ] - łańcuchy s1 i s2 są identyczne

[ s1 != s2 ] - łańcuchy s1 i s2 nie są identyczne
[ s1 ] - łańcuch s1 nie jest pusty
Można budować bardziej złożone warunki korzystając z operatorów logicznych. Operator AND zapisywany jako -a, operator OR jako -o.
Natomiast operator negacji NOT jako wykrzykinik !.

W zapisie warunku istotne jest zachowanie spacji pomiędzy ograniczającymi nawiasami kwadratowymi a treścią warunków, tak jak
pokazano to wyżej.

A teraz warunki użyte w skrypcie:
[ -z "$1" ] - łańcuch odpowiadający pierwszemu argumentowi polecenia (stara_nazwa) ma
zerową długość

[ ! -f $1 ] - plik wskazywany przez zmienną $1 nie istnieje bądź nie jest plikiem zwykłym
[ ! -w . ] - nie mamy prawa czytania do pliku oznaczonego kropką, która jest aliasem

[ -z "$2" ] - łańcuch odpowiadający drugiemu argumentowi polecenia (nowa_nazwa) ma zerową

bieżącego katalogu, czyli nie mamy prawa czytania do bieżącego katalogu

długość (jest pusty)
Oczywiście aby nasz skrypt zadziałał, musimy mu nadać prawo wykonywania i umieścić go w odpowiednim katalogu (analogicznie jak w
przypadku poprzedniego skyrptu):
$ chmod 755 zmk
[crash@linux /crash1]$ mkdir bin
[crash@linux /crash1]$ mv zmk ./bin
[crash@linux /crash1]$ which zmk
/home/crash1/bin/zmk

[crash@linux /crash1]$ _

Teraz możemy już wypróbować skrypt zmk:
$ zmk
zmk: uzywaj: zmk stara_nazwa [nowa_nazwa]

[crash@linux /crash1]$ zmk blablabla
zmk: Plik zrodlowy nie jest dostepny

background image

5

[crash@linux /crash1]$ ls -F

bin/ kat2/

[crash@linux /crash1]$ zmk kat2
zmk: Plik zrodlowy nie jest dostepny

[crash@linux /crash1]$ touch blablabla
[crash@linux /crash1]$ zmk blablabla
zmk: Przyjeto domyslna nazwe 'nowy'

[crash@linux /crash1]$ ls -F
bin/ kat2/ blablabla.old nowy

[crash@linux /crash1]$ zmk nowy blablabla
[crash@linux /crash1]$ ls -F
bin/ kat2/ blablabla blablabla.old nowy.old


Wyszukiwarka

Podobne podstrony:
blok 2 skrypt id 90327 Nieznany (2)
blok 3 skrypt id 90351 Nieznany (2)
md skrypt id 290151 Nieznany
AiSD skrypt id 53503 Nieznany (2)
Enzymologia Skrypt I id 162159 Nieznany
blok 8 skrypt id 90430 Nieznany (2)
Ekonomia skrypt id 156120 Nieznany
MANGANOMETRIA skrypt id 278631 Nieznany
Eschatologia skrypt id 163497 Nieznany
mikro II skrypt id 300610 Nieznany
Prawoznawstwo skrypt id 388928 Nieznany
parazyty skrypt id 349280 Nieznany
handel zagraniczny skrypt id 19 Nieznany
ELEKTROFOREZA skrypt id 158052 Nieznany
blok 5 skrypt id 90384 Nieznany (2)
Chemia analityczna skrypt id 11 Nieznany
Logika SWPW MGR Skrypt id 27217 Nieznany
ksop skrypt id 252775 Nieznany

więcej podobnych podstron