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.*/
Wiekszosc funkcji do zarzadzania zmiennymi znajduje sie w pliku sh.set.c /*wybralem ciekawsze, a reszte wycialem */.
Prosze najpierw przeczytac strone Marcina Rudolfa i Przemka Kubackiego o bashu (znajduja sie tam wiadomosci ogolne o shellach).
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.
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":
if (warunek) then
polecenia
else if (warunek2) then
....
else
....
endif
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 :
-s plik #plik nie jest pusty
-r plik #masz prawo czytania pliku
-w plik #masz prawo pisania w pliku
-x plik #masz prawo wykonywania pliku
-f plik #plik istnieje i jest zwyklym plikiem
-d plik #plik to katalog
-c plik #jest to plik specjalny znakowy
-b plik #jest to plik specjalny blokowy
-b plik #plik to bufor typu FIFO
-u plik #plik ma ustawiony bit SUID
-g plik #plik ma ustawiony bit SGID
-k plik #plik ma ustawiony bit sticky
Operatory logiczne, arytmetyczne i porownania sa standardowe (jak dla C) tzn.: &<,&>,&>=,&<=,==,!=,....
while (warunek)
polecenia
end
foreach zmienna (zbior)
polecenia
end
switch (nazwa)
case nazwa1:
polecenia;
breaksw
.....
default:
polecenia;
breaksw
endsw
#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;
Instrukcja $<
Za zmienna jest wpisywany ciag znakow z klawiatury (az do znaku konca lini).
while ( $tak != "n" )
echo "Czy chcesz kontynuowac zabawe ?[t/n]n"
setenv tak $<
echo $tak
end
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)
#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
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:
Wybranie odpowiedzi y powoduje zaakceptowanie propozycji poprawy, n - pozostanie przy pierwotnej wersji, e-edytowanie lini, a-przerwanie.
Historia to wszystkie wczesniej wywolane komendy, przy czym w tcsh sa one pamietane wraz z numerami wykonania, stad gdy napisze
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.
By ulatwic sobie prace mozemy uzywac takiej formy wzorca :
Spowoduje to usuniecie wszystkich plikow, ktorych pierwsza litera jest a, druga litera z zakresu a-s, a trzecia b lub c.
#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'