Do spisu tresci tematu 10

10.6 Interpretator polecen - Tcsh


Spis tresci


Budowa tcsh

Postaram sie tutaj opisac najciekawsze fragmenty zrodel tcsh jakie mi sie udalo znalezc (i zrozumiec :-)).

Jedna z ciekawostek, o ktorych warto chyba wspomniec jest przygotowanie przez autorow zrodel tego programu w taki sposob by niewiele tlumaczac mozna bylo zamienic komendy danego jezyka na komendy innego. Pliki zrodlowe z tlumaczeniami roznych komend znajduja sie w podkatalogu katalogu nls, o nazwie jezyka, ktorego chcemy uzywac /*jest to znakomita okazja dla Polakow aby opracowac zestaw polskich komend */ .Oto przykladowe dwa pliki z komendami narodowymi angielskimi i greckimi:

plik ./tcsh-6-07-02/nls/C /set9

i plik ./tcsh-6-07-02/nls/greek/set9 /* osoby bez zainstalowanych greckich czcionek i ustawionego "encodowania" na grecki niestety zobacza tylko krzaczki.*/


Podstawowe struktury danych :


Funkcje zarzadzania zmiennymi :

Wiekszosc funkcji do zarzadzania zmiennymi znajduje sie w pliku sh.set.c /*wybralem ciekawsze, a reszte wycialem */.


Ciekawe rozwiazania programistyczne :


Slowniczek


Informacje dla osob czytajacych te strone

Prosze najpierw przeczytac strone Marcina Rudolfa i Przemka Kubackiego o bashu (znajduja sie tam wiadomosci ogolne o shellach).

Tcsh - co kazdy wiedziec powinien

Tcsh -jest to rozszerzony C-shell (chociaz jest w pelni kompatybilny z csh-standardowym C-shellem ). Jego skladnia przypomina C (stad nazwa) i dlatego byc moze cieszy sie rownie duzym powodzeniem w srodowisku "unixowym " co bash.

Skladnia jezyka skryptowego dla tcsh

        

Zmienne pozycyjne i "$-symbole"

Skrypt w shellu tcsh moze zostac wywolany z dziewiecioma argumentami, do ktorych odwolujemy sie przez $1,...,$9 .Polecenie "shift" daje mozliwosc przesuniecia parametrow o jeden w lewo zatem taki skrypt

        # !/bin/csh
        echo $1 $2 $3
        shift
        echo $1 $2 $3
        

przy uruchomieniu go z a,b,c,d da nam:

        a b c 
        b c d 
        

Inne "$-symbole":

Instrukcja warunkowa if

        if (warunek) then
                  polecenia
        else if (warunek2) then
                ....
        else
        ....
        endif   
        

Przyklady:
if ( -f /bin/ps );
        then
         /bin/ps;echo -n 'wykonalo sie ps' >/dev/tty8
endif
if ($1 == "start" )
        then
         echo "System startuje.";/bin/skrypt;
        else if ($1 == "stop" ) then
         echo "System pada . ";/bin/skrypt2;
        else
         echo "Zle uzywasz tego skryptu";
endif

Jak widac skladnia if ... jest bardzo intuicyjna (przypomina C).

Operatory do testowania plikow :

Operatory logiczne, arytmetyczne i porownania sa standardowe (jak dla C) tzn.: &<,&>,&>=,&<=,==,!=,....

Przyklady:
if (-s /tmp/s )... #jesli /tmp/s jest niepusty
if ($? ==0) ... #jesli poprzednie polecenie zostalo wykonane poprawnie




Instrukcje sterujace

Instrukcja while
        while (warunek) 
                  polecenia
        end
        
Instrukcja foreach
        foreach zmienna (zbior) 
                  polecenia
        end
        
Instrukcja switch
        switch (nazwa)
        case nazwa1:
                polecenia;
                breaksw
        .....
        default:
                polecenia;
                breaksw
        endsw
        
        
Przyklady:
#1
while ( 1 == 1)
  ls -la  ;
end


#2
foreach n (. s5 s6)
  ls -la $n;
end;


#3
        switch ($1)
        case "pppp":
                echo "to pppp";
                breaksw;
        case "ssss":
                echo "to ssss"
                breaksw;
        default:
                echo "to default";
                breaksw;
        endsw;
        


Komunikacja z uzytkownikiem

Instrukcja $<

setenv zmienna $<

Za zmienna jest wpisywany ciag znakow z klawiatury (az do znaku konca lini).


Przyklad:


Ciekawostki

Warunkowe lacza komunikacyjne "||" i "&&".

Operacje "||" i "&&" to tzw. warunkowe lacza komunikacyjne gdy interpretator spotka jeden z nich ,bada wartosc wykonania tego co jest przed laczem. Jesli mamy do czynienia z "&&" to druga czesc jest wykonywana tylko jesli pierwsza konczy sie sukcesem (w przypadku "||" jest odwrotnie)

Przyklady:

#1

        grep piotr /etc/passwd && grep piotr /etc/group
        #Jesli w passwd znaleziono piotra jest on poszukiwany w group,
        #w przeciwnym przypadku konczymy dzialanie.
        
        /usr/local/skrypt && echo "Wszystko gra" || mail root > /tmp/wynik_skryptu
        #Jesli skrypt zakonczy sie sukcesem wypiszemy komunikat "wszystko gra",
        #jesli cos sie nie uda zostanie wyslany komunikat do roota z wynikami
        



Automatyczna korekcja blednie napisanych komend

Ciekawa cecha interpretatora jest mozliwosc proponowania przez niego zastapienia blednie napisanych komend, plikow lub zmiennych ich nazwami wlasciwymi . Jesli chcemy skorzystac tej uslugi, to powinnismy ustawic zmienna cmd correct na cmd, jesli chcemy by poprawiane byly tylko komendy, albo na all, wtedy wszystko jest poprawiane:

>set correct = cmd
>lz /usr/bin
CORRECT>ls /usr/bin(y|n|e|a)

Wybranie odpowiedzi y powoduje zaakceptowanie propozycji poprawy, n - pozostanie przy pierwotnej wersji, e-edytowanie lini, a-przerwanie.


Korzystanie z historii

Historia to wszystkie wczesniej wywolane komendy, przy czym w tcsh sa one pamietane wraz z numerami wykonania, stad gdy napisze

!12

Odwoluje sie do dwunastej komendy za zycia tego shella wywolanej. Moge rowniez korzystac z innych sposobow dla odwolywania sie do wczesniej uzytych komend:

W przypadku ustawienia wlasciwych zmiennych (w plikach .cshrc .logout) savehist, histfile na odpowiednie pliki, historia jest nagrywana po wylogowaniu i wgrywana po uruchomieniu sesji.

Wzorce

By ulatwic sobie prace mozemy uzywac takiej formy wzorca :

>rm a[a-s][bc]

Spowoduje to usuniecie wszystkich plikow, ktorych pierwsza litera jest a, druga litera z zakresu a-s, a trzecia b lub c.


Przykladowy plik .cshrc

#Oto przykladowy plik .cshrc
#definicje kilku niepotrzebnych zmiennych
#komentarze sa umieszczane po znaku #
set sysname=`uname -s`
set release=`uname -r`
#ustawiamy sciezke wyszukiwania
  set path=(. /sbin /bin /usr/sbin /usr/bin /usr/ucb /etc /usr/etc /usr/net )
  set manpath=(/usr/man /local/man)
  setenv XAPPLRESDIR /usr/lib/X11/app-defaults:${HOME}/app-defaults:.
  setenv NNTPSERVER news.mimuw.edu.pl


#ustawiamy prawa dostepu jakie automatycznie beda ustawiane nowo stworzonemu
#plikowi
umask 077

#ustawienie wlasnosci terminala
stty sane
stty erase ^H
stty kill ^U
stty intr ^C


#zwiekszenie (lub zmniejszenie zasobow) dostepnych dla pojedynczego procesu
 
limit coredumpsize 0
limit stacksize 8m
limit datasize  12m

#zabezpieczenie sie przed stworzeniem dla roota (jego numer =0)
#zbyt bogatego srodowiska
if ($?USER == 0 || $?prompt == 0 ) exit

set localhost=`hostname`
set PAGER=more

#ustawiamy zmienna prompt tak by widziec zawsze, ktora to komenda zostala
#wykonana(!), kto jest rzeczywistym wlascicielem procesu shella (whomai)
#gdzie pracujemy (localhost), w jakim katalogu sie znajdujemy (zmienna
#cwd uaktualniana przy kazdej zmianie katalogu).
set prompt=!\:`whoami`@${localhost}:${cwd}\>

#jak daleko sa pamietane (i nagrywane) komendy z historii (dostepne za
#pomoca strzalki
set history=30 savehist=20
set time=100

#tu widac jak dziala nasz sympatyczny prompt
alias cd         'cd \!* ; set prompt=!\:${user}@${localhost}:${cwd}\>' 

#w aliasie parametr (ktory chcemy gdzies umiescic) przekazujemy za pomoca
#\!*
alias fl         'find . -name \!* -print'
alias icm       ssh -l proszkowski atol.icm.edu.pl 
alias dcarramba    'setenv DISPLAY carramba:0.0'


Autor: Piotr Roszkowski