background image

 

 

Wykład 14

Skrypty powłoki (2)

background image

 

 

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

background image

 

 

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 

background image

 

 

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

background image

 

 

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 &

background image

 

 

Arytmetyka w powłoce 

CSH

Polecenia arytmetyczne zaczynają się od 

znaku 

@

#!/bin/csh

echo podaj liczbe

set liczba = $<

@ wynik = $liczba * 2

echo $wynik

background image

 

 

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)

background image

 

 

Skrypt „odliczający”

#!/bin/csh

echo Podaj liczbe

set liczba=$< 

while (liczba > 0)

@ liczba–-

sleep 1

echo jeszcze $liczba sekund

end 

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

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

background image

 

 

Skrypty startowe systemu

Skrypty 

startowe 

znajdują 

się 

katalogu 

/etc

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.

background image

 

 

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.

background image

 

 

Jeszcze jeden skrypt

#!/bin/csh

source życzenia_świąteczne

init 6


Document Outline