- Vedle standardního (Bournova) shellu sh je C shell (csh) druhým "klasickým" interpretem příkazů v Unixu
- syntaxe připomíná jazyk C
- jsou v něm naprogramovány některé nástroje
- často bývá "povinným"shellem na pracovišti
- základem pro některé další shelly
- větší možnosti pro interaktivní používání
- vychází ze standardního shellu, není bohužel jeho
nadmnožinou
- scénáře Bournova shellu nelze bez úprav interpretovat csh
- možnosti jako programovacího jazyka však jsou horší než standardního shellu.
.
csh [ -cefinstvVxX ] [argumenty...]
- Existuje-li v domovském adresáři soubor .cshrc, pak nejprve C shell interpretuje příkazy v něm zapsané
- byl-li csh vyvolán jako přihlašovací shell, pak po interpretaci scénáře .cshrc hledá v domovském
adresáři soubor .login (analogii .profile v Bournově
shellu) a interpretuje jej
- .logout se interpretuje C shellem při odhlášení ze systému
- C shell bez argumentů (interaktivní
shell) se ohlásí výzvou
- % běžnému uživateli
- # superuživateli.
| Volba | Význam |
| -c | následující argument je jméno souboru s scénářem a další argumenty předává scénáři jako parametry v poli argv |
| -e | ukončí shell, pokud některý z interpretovaných příkazů končí abnormálně či s nenulovým návratovým kódem |
| -f | "rychlý" start, nečte soubory .cshrc a .login |
| -i | interaktivní shell, i když primární vstup není z terminálu |
| -n | pouze kontrola syntaxe příkazů bez jejich provádění |
| -s | vstup příkazů ze standardního vstupu |
| -t | čte a interpretuje jeden řádek, který může pokračovat na fyzických řádcích, zamaskovaných znakem \ |
| -v | "hlasitá" interpretace (nastaví proměnnou verbose), zobrazuje vstupy příkazů po náhradě historie a před jejich vykonáním |
| -V | nastaví proměnnou verbose před interpretací .cshrc |
| -x | nastaví proměnnou echo, tisk každého příkazu a jeho argumentů před vykonáním |
| -X | nastaví proměnnou echo před interpretací .cshrc |
- '*', '.', '[', ']' jako standardní shell
- znak ~ (vlnovka) má hodnotu domovského adresáře ( $HOME )
- lze používat zápisu pomocí znaků {}, mezi něž se uzavřou variantní části - a{b,c,d}e je zkratkou pro abe, ace, ade .Tak
- ./zdroj/{prog1,prog2,prog3}.c se rozvine na ./zdroj/prog1.c, ./zdroj/prog2.c, ./zdroj/prog3.c
- konstrukce {}lze vnořovat do sebe.
Př.
Např. všechny soubory z podadresářů Mail, tmp a /bin
našeho domovského adresáře zkopírujeme do podadresáře
kopie:
% cp ~/{Mail, tmp, bin}/* ~/kopie
- Stejné prostředky jako u standardního shellu, liší se pouze přesměrování chybového výstupu
- nelze přesměrovat obecný kanál no jiného ( jako u Bournova shellu)
- přesměruje se spolu se standardním výstupem pomocí dvojice znaků >&, popř. se připojí operátorem >>&.
Př.
Standardní i chybový výstup při překladu prog1.c se
přesměruje do souboru chyby:
% cc prog1.c >& chyby
a standardní i chybový výstup z překladu prog2.c se k
němu připojí příkazem
% cc prog2.c >>& chyby
-
C shell má navíc k dispozici proměnnou noclober, její nastavení příkazem
set noclober
zabrání přepisu či rozšíření souboru již existujícího při přesměrování.
- pokud je třeba při
nastavené proměnné soubor přesměrováním změnit, zapíše se
přesměrování ve tvaru >! a >>!
- ochrana proti přepisu se
zruší příkazem
unset noclober
Př.
Vytvoříme např. seznam uživatelů, přihlášených do
systému a nastavíme ochranu proti přepisu:
% who > seznam
% set noclober .
Budeme-li po čase na konec tohoto souboru přidat
aktuální přihlášené uživatele, pak nám to C shell
nedovolí:
% who >> seznam
seznam: File exist
a musíme použít zápisu
% who >>! seznam
- Stejná pravidla jako pro sh
- uzavření skupiny příkazů do () znamená opět vytvoření nového shellu
- nelze však použít {} pro vykonání skupiny příkazů v aktuálním shellu jako v sh
- kolony a podmíněné provádění příkazů v kolonách stejné jako ve standardním shellu
- navíc možnost předání chybového výstupu spolu se standardním výstupem rourou na vstup následujícího příkazu pomocí |&
Př.
stránkování chybového výstupu z překladu
% cc prog.c |& more
- Příkazy odeslané z příkazové řádky tvoří job (práci) a mají identifikační číslo
- pro práce spuštěné na pozadí (příkazová řádka ukončená & ) C shell oznámí v hranaté závorce číslo práce, následované čísly procesů, které
- spustila
- v pozadí může běžet několik prací, v popředí jedna
- práci na popředí lze nejen ukončit signálem INTR ( stiskem klávesy CTRL C,popř. DELETE ), ale též pozastavit signálem STOP (klávesa CTRL Z nebo CTRL <@> )
- pozastavenou práci lze znovu spustit na popředí nebo na pozadí
- pokud práce spuštěná na pozadí potřebuje vstup dat z klávesnice, pozastaví se a oznámí to na obrazovku.
- uživatel může tuto práci přesunout do popředí, zadat interaktivně vstupní data a popř. ji opět odsunout do
- pozadí
- výpis dat práce na pozadí na standardní výstup standardně probíhá bez upozornění
- běží-li současně několik takových prací, pak by mohly smíchat výstupy z různých programů
- to lze odstranit příkazem
stty totstop,
který každý výstup z práce běžící na pozadí pozastaví a oznámí to na obrazovku
- po převedení práce na popředí se výstup vytiskne a práce dále pokračuje
- pozastavení standardního výstupu prací na pozadí se odstraní příkazem
stty -totstop.
Stav prací pozadí se zjistí příkazem jobs, který oznámí:
- čísla prací v hranatých závorkách
- stavy, v nichž se nalézají
- práce naposledy převedena do pozadí je označena +
- předcházející -.
Stav práce může být:
- Running práce běží
- Stopped práce je pozastavená
- Killed násilně ukončená
- Done normálně ukončená
- Exit ukončená s chybou (nenulový kód návratu)
Ukončí-li se práce na pozadí, oznámí to C shell
uživateli při nejbližším zobrazení systémové výzvy ( aby
nerušil aktuální práci v popředí).
Příkazy pro manipulaci s prací (jobem) v pozadí mají
jako argument identifikaci práce, začínající znakem %.
Pokud se argument neuvede, předpokládá se aktuální práce
- tj. poslední pozastavená nebo na pozadí převedená
práce.
Identifikovat práce
%[práce], kde práce může být zadána takto:
- % nebo %+ nebo %% aktuální práce
- %- předcházející práce
- %n práce s číslem n
- %řetězec práce, identifikovaná jednoznačně řetězcem
Př.
Běží-li v pozadí příkazy
%sort sez1 > vys1
%sort sez2 > vys2,
pak můžeme pozastavit prvé třídění příkazem
%kill sort sez1
Příkazy pro manipulaci s prací:
- bg [%práce]
- převede práci do pozadí
- fg [%práce]
- převede práci do popředí
- kill [-sig] {[pi...]|[%práce...]}
- Zašle specifikovaný>
signál specifikované práci. Nezadá-li se volba sig, pak
pošle signál TERM (ukončení práce) procesu
specifikovanému pid nebo zadané práci. Volbu -sig lze
zadat číselně nebo jménem signálu. Jména signálů, která
lze použít se zjistí příkazem kill -l.
- limit [-h] [[prostředek [maximální_hodnota]]
- omezí
systémový prostředek aktuálního procesu a všech jeho
potomků na maximální hodnotu. Příkaz bez argumentů
vypíše aktuální omezení pro všechny prostředky, zadá-li
se příkaz limit prostředek, vypíše se aktuální omezení
daného prostředku. Volba -h je přístupná pouze
superuživateli a nastavuje tvrdá omezení na systémové
prostředky, které běžný uživatel nemůže překročit. Omezit
lze např.tyto prostředky:
- cputime n maximální trvání procesu je v sekundách
rovno n, nebo nh n hodin, nm n minut.
- filesize nk maximální velikost souboru v kilobytech
je n (k je standardní), nm n megabytů
- datasize maximální datová oblast procesu (včetně
zásobníku), udává se jako pro filesize
- stacksize maximální velikost zásobníku procesu,
udává se jako pro filesize
- coredumpsize maximální souboru pro dump paměti, udává
se jako pro filesize
- unlimit [-h] [prostředek]
- zruší omezení prostředku. ,
viz příkaz limit . Volba -h, přístupná pouze
superuživateli, zruší Tvrdá omezení. Nezadá-li se
prostředek, pak se ruší omezení na všechny prostředky
- notify [%práce]
- oznámí stav práce. Chceme-li zprávu o
jakékoliv změně všech prací, nastavíme vnitřní proměnnou
příkazem set notify.
- stop [%práce]
- pozastaví práci běžící v pozadí
- Počet řádků pro uložení historie příkazů se
zadává ve vnitřní proměnné history- např. pamatování
deseti posledních příkazů :
%set history=10
- k výpisu historie příkazů slouží příkaz
history [-hr] [n],
který standardně vypisuje pro všechny zapamatované
řádky jejich čísla a obsah. Volba
- -h vypisuje příkazové řádky bez čísel
- -r je výpis příkazů v opačném pořadí jejich zadávání
- n omezí výpis historie na
posledních n příkazových řádek.
Př.
Pomocí volby -h můžeme např. "automaticky" generovat
scénáře - tak budeme-li opakovat určitou posloupnost pěti
příkazů, pak po jejich prvém průběhu je uložíme do soboru
akce5:
% history -h 5 > akce5
a v dalším je můžeme již pouze interpretovat
% csh akce5.
Pokud chceme znovu vykonat některý ze zapamatovaných
příkazů, vyvoláme jej pomocí znaku !, následovaného
identifikací řádku:
| Povel | Význam |
| !! | poslední řádek |
| !n | řádek s číslem n |
| !-n | n-tý řádek před řádkem aktuálním |
| !řetězec | poslední řádek začínající řetězcem |
| !?řetězec | poslední řádek končící řetězcem |
!?řetězec? | poslední řádek obsahující řetězec obklopený libovolnými znaky |
Při konstrukci nového příkazového řádku lze použít slov
z minulých příkazů. Slova se uvozují dvojtečkou, za
kterým následuje označení slova:
| Označení | Význam |
| # | celá příkazová řádka |
| 0 | prvé slovo příkazové řádky (název příkazu) |
| n | n-té slovo příkazové řádky, speciální znaky C
shellu se považují rovněž za slova (& | > <
atd.) |
| $ | poslední slovo příkazové řádky |
| % | poslední nalezené slovo při hledání příkazem
? (viz dále) |
| a-b | rozmezí slov a až b (např. 4-6) |
| * | prvé až poslední slovo příkazové řádky (bez
nultého, tedy bez názvu příkazu) |
| a* | zkratka pro a-$ |
| a- | slova od a do předposledního slova řádky |
Nový příkazový řádek, vytvořený tímto způsobem můžeme
ještě modifikovat příkazy, kterým předchází dvojtečka a
které jsou analogické příkazům editoru ed:
| Příkaz | Význam |
| h | odstraní z úplné cesty jméno souboru |
| r | odstraní ze jména souboru příponu (poslední
tečku a řetězec za ní následující) |
| s/řetězec/náhrada | nahradí řetězec náhradou |
| t | ponechá z úplné cesty je jméno souboru |
| & | opakuje poslední náhradu |
| g | použije-li se jako předpona předcházejících
povelů, platí tyto globálně ve všech slovech |
| P | vytiskne novou příkazovou řádku bez vykonání |
| ^řetězec^náhrada | zkrácený zápis s/řetězec/náhrada |
V povelech náhrady nelze používat regulární výrazy,
pokud chceme nahrazovat v řetězci /, je třeba je
zamaskovat jako \/, stejně tak & v náhradě musíme psát
\&.
Příjemným rysem C shellu je mechanismus tvorby,
zobrazování, modifikace a rušení přezdívek -alias jmen
pro příkazy a jejich skupiny. Příkazem
alias [název [definice]],
který přiřadí přezdívku název příkazové řádce,
obsahující definici. Příkaz bez argumentů vypíše všechny
přezdívky a jejich definice, zadá-li se pouze název,
vypíše se definice přezdívky. V definici lze použít i
odkazů na předcházející příkazy.
Př.
Pro výpis
archivu ve formátu tar z diskety se vyplatí zkrátit povel
tar tvf /dev/fd113ds15 na vypis:
% alias vypis tar tvf /dev/fd113ds15
Výpis adresáře s podrobnými informacemi o
souborech pomocí ls -la po stránkách na obrazovku
přezveme na dir příkazem
% alias dir 'ls -la \!* | more'.
Zde jsou apostrofy použity pro zamaskování speciálních
znaků (*,|) a \maskuje ! , aby nedošlo k náhradě
předešlého příkazu již při psaní alias. Připomínáme, že
!* jsou argumenty z příkazové řádky aktuálního příkazu.
Příkazy alias lze do sebe vnořovat, např. potřebujeme-
li vytvořit přezdívku dirs pro příkazy, které výpis
pomocí dir ještě zapíší do souboru sseznam, můžeme to
zapsat
% alias dirs 'dir | tee sseznam'.
Použijeme-li název v definici téhož příkazu alias, pak
při jeho provedení dojde k chybě.
Platnost přezdívky se zruší příkazem
unalias název.
Např. všechny přiřazené přezdívky se zruší příkazem
% unalias *
Přezdívky, přiřazené pomocí příkazu alias platí pouze
pro aktuální shell; chceme-li používat trvale některé z
nich, zapíšeme je do souboru .cshrc nebo .login.