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'