Wykład 14
Skrypty powłoki (2)
Diagnostyka
Zarówno w powłoce csh, jak i bash
można
dla
celów
diagnostycznych
uruchomić
wydruk
wykonywanych
komend. Można to zrobić w nagłówku
skryptu:
#!/bin/csh –x
#!/bin/bash –x
Dla powłoki csh działają w obrębie
skryptu komendy
set echo
oraz
unset
echo
Strumień wyjściowy
Strumień
wyjściowy
może
być
skierowany na ekran albo do pliku przez
przekierowanie, np.
ls > plik
. Jeżeli
jednak chcemy go „rozdwoić” (na ekran
i do pliku, do kilku plików) używamy
komendy
tee
która zapisuje strumień
wejściowy do podanych plików oraz
kieruje go na wyjście standardowe.
who | tee –a plik1 plik2
Praca skryptu w tle
Skrypt można uruchomić w tle:
./skrypt &
Można jednak też „zawiesić” działanie
już działają-cego skryptu klawiszami
Ctrl
+
Z
, a potem przywra-cać go do pracy
„w tle” komendą
bg %1
albo przy-wrócić
„na pierwszy plan” komendą
fg %1
Praca skryptu w tle
Skrypt uruchomiony w tle zostanie
przerwany, jeżeli próbuje czytać dane z
terminala (klawiatury). Jeżeli musi on
czytać jakieś dane, należy je wcześniej
przy-gotować, umieścić w pliku i
przekierować zawartość tego pliku do
standardowego wejścia skryptu!
./skrypt < dane_wejściowe > wyniki &
Arytmetyka w powłoce
CSH
Polecenia arytmetyczne zaczynają się od
znaku
@
#!/bin/csh
echo podaj liczbe
set liczba = $<
@ wynik = $liczba * 2
echo $wynik
Arytmetyka w powłoce
CSH
Dozwolone operatory arytmetyczne:
@ wynik = $liczba + 2
@ wynik = $liczba - 2
@ wynik = $liczba * 2
@ wynik = $liczba / 2
@ wynik++
@ wynik--
@ wynik = ($liczba > 2)
Skrypt „odliczający”
#!/bin/csh
echo Podaj liczbe
set liczba=$<
while (liczba > 0)
@ liczba–-
sleep 1
echo jeszcze $liczba sekund
end
Zmienna jako tablica
wartości
#!/bin/csh
set pliki=`ls`
echo Oto nazwy paru plikow z katalogu ./
echo Oto pierwszy plik: $pliki[1]
echo I jeszcze trzy nastepne: $pliki[2-4]
echo Policzmy ile linii ma każdy plik
wc $pliki
Skrypt dla drukarzy
Skrypt
podaje,
na
ilu
stronach
standardowego wydruku mieści się plik
o nazwie podanej jako argu-ment przy
wywołaniu:
#!/bin/csh
set llin=`wc < $1`
@ lstr = ($llin[1] / 60) + 1
echo Plik $1 zajmie $lstr stron
Skrypt dla programistów
Skrypt podaje, ile plików w bieżącym
katalogu to skrypty:
#!/bin/csh
if ($1 == ””) then
set kat = ”./”
else
set kat = $1
endif
set licz=`file ${kat}/* | grep script | wc`
echo W tym katalogu jest $licz[1] skryptow
Skrypt tworzący pliki
Skrypt tworzy podaną liczbę plików:
#!/bin/csh
if ($1 == "") then
echo Nie podales poczatku nazwy plikow
else
if ($2 > 0) then
set licz=$2
while ($licz > 0)
touch ${1}${licz}
@ licz--
end
else
echo Podales zla liczbe plikow
endif
endif
Dość obliczeń, teraz
szpiegostwo
Skrypt podaje, czy dany użytkownik
właśnie pracuje
#!/bin/csh
echo Podaj nazwe uzytkownika
set imie=$<
if (`w $imie |grep $imie` =="" ) then
echo nie ma
else
echo jest
endif
Nie dajmy się oszukać
Jeżeli użytkownik ma nam podać jakieś
dane, ale tego nie zrobi, skrypt może
przerwać działanie zgłaszając błąd. Jak
się przed tym uchronić?
#!/bin/csh
if ( $?sygnał ) then
echo Ustawiono sygnał
else
echo Jeszcze nie było sygnału!
endif
Duże skrypty składamy z
„klocków”
Służy do tego komenda
source
(w csh)
lub
.
(w bash), która dołącza do skryptu
dany plik
#!/bin/csh
echo zaraz wykonam polecenia skryptu plik1
source plik1
#!/bin/sh
echo zaraz wykonam polecenia skryptu plik1
. plik1
Powłoka startowa
Gdy użytkownik loguje się do systemu,
wykonywane
są
skrypty
startowe
odpowiedniej
powłoki.
Użytkow-nik
może
wybrać
powłokę
startową
poleceniem
chsh –s /bin/csh
chsh –s /bin/sh
chsh –s /bin/bash
Skrypty startowe
Skrypty startowe zależą od powłoki,
mają m.in. ustawić środowisko (katalogi
komend). Dla powłoki csh czytane są
skrypty
/etc/csh.cshrc /etc/csh.login ~/.cshrc
~/.login
~/.tcshrc
(dla wariantu tcsh)
zaś dla bash:
/etc/profile
~/.profile
~/.bashrc
Skrypty startowe
Przykładowy plik startowy dla powłoki
csh:
# /etc/csh.cshrc: system-wide .cshrc file
# for csh(1)/tcsh(1).
if (( $?prompt ) && ( $?tcsh )) then
if ( "$?TERM" == "linux" ) then
set prompt = "%m:%B%~%b%# "
else
set prompt = "%U%m%u:%B%~%b%# "
endif
endif
Skrypty startowe
Przykładowy plik startowy dla powłoki
bash:
# ~/.profile: executed by Bourne-compatible
# login shells.
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbi
n:/usr/bin:/sbin:/bin:/usr/bin/X11
export PATH
Skrypty startowe systemu
Skrypty
startowe
znajdują
się
w
katalogu
/etc
,
a
w
podkatalogu
/etc/init.d
znajdziemy skrypty startowe
systemu i usług systemowych
takich jak
usługi siecio-we, konsole, montowanie
dysków... Nie są one jednak wywoływane
bezpośrednio z tego katalogu, lecz z sze-
regu katalogów
/etc/rc0.d
,
/etc/rc1.d
..
aż do
/etc/rc6.d
które opisują, co należy
zrobić w danej fazie pracy systemu.
Skrypty startowe systemu
Katalogi
/etc/rc0.d
... zawierają skróty
do
niektórych
skryptów
katalogu
/etc/init.d
; cyfry od 0 do 6 to oznaczenia
poziomów pracy systemu (run-levels),
które root może zmieniać komendą
init
,
np.
init 6
Poziom
0
to start systemu,
1
(tzw.
single-user) - dia-gnostyczny,
2-5
to
normalna
praca,
6
- zatrzymanie
systemu.
Jeszcze jeden skrypt
#!/bin/csh
source życzenia_świąteczne
init 6