C shell - C shell

C shell
Tcsh ejecutándose en escritorio Mac OSX.png
tcsh a sh vedle sebe na ploše Mac OS X
Původní autoři Bill Joy
První vydání 1978 ; Před 43 lety ( 1978 )
Stabilní uvolnění
6.20.00 / 24. listopadu 2016 ; Před 4 lety ( 2016-11-24 )
Úložiště Upravte to na Wikidata
Napsáno C
Operační systém BSD , UNIX , Linux , macOS
Typ Unix shell
Licence Licence BSD
C Shell běžící na Windows Services pro UNIX

C shell ( csh nebo vylepšená verze, tcsh ) je Unix shell vytvořil Bill Joy , zatímco on byl postgraduální student na University of California, Berkeley v pozdní 1970. Byl široce distribuován, počínaje vydáním 2BSD vydání Berkeley Software Distribution (BSD), které Joy poprvé distribuovala v roce 1978. Dalšími prvními přispěvateli myšlenek nebo kódu byli Michael Ubell, Eric Allman , Mike O'Brien a Jim Kulp.

C shell je příkazový procesor, který se obvykle spouští v textovém okně a umožňuje uživateli psát a provádět příkazy. Prostředí C může také číst příkazy ze souboru, který se nazývá skript . Stejně jako všechny skořápky Unix podporuje zástupné znaky souborů , piping , zde dokumenty , substituci příkazů , proměnné a řídicí struktury pro testování podmínek a iteraci . Co odlišovalo C shell od ostatních, zejména v 80. letech, byly jeho interaktivní funkce a celkový styl. Jeho nové funkce usnadnily a zrychlily používání. Celkový styl jazyka vypadal spíše jako C a byl viděn jako čitelnější.

Na mnoha systémech, jako jsou macOS a Red Hat Linux , je csh ve skutečnosti tcsh , vylepšená verze csh. Jedním ze dvou souborů je často pevný odkaz nebo symbolický odkaz na druhý, takže oba názvy odkazují na stejnou vylepšenou verzi prostředí C.

V Debianu a některých derivátech (včetně Ubuntu ) existují dva různé balíčky: csh a tcsh. První je založen na původní BSD verzi csh a druhý je vylepšený tcsh.

tcsh přidal název souboru a dokončení příkazu a koncepty úpravy příkazového řádku vypůjčené ze systému Tenex , který je zdrojem „t“. Protože pouze přidal funkčnost a nezměnil to, co tam bylo, zůstal tcsh zpětně kompatibilní s původním C shellem. Ačkoli to začalo jako boční větev z původního zdrojového stromu, který Joy vytvořila, tcsh je nyní hlavní větev pro pokračující vývoj. tcsh je velmi stabilní, ale nová vydání se i nadále objevují zhruba jednou za rok a sestávají většinou z oprav drobných chyb.

Cíle a funkce designu

Hlavními cíli návrhu pro C shell bylo to, že by měl vypadat spíše jako programovací jazyk C a že by měl být lepší pro interaktivní použití.

Spíš jako C.

Systém Unix byl napsán téměř výlučně v jazyce C, takže prvním cílem prostředí C byl příkazový jazyk, který byl více stylisticky konzistentní se zbytkem systému. Klíčová slova, použití závorek a vestavěná výrazová gramatika C shellu a podpora polí byla silně ovlivněna C.

Podle dnešních standardů se C shell nemusí zdát zvlášť podobný C jako mnoho jiných populárních skriptovacích jazyků. Ale v 80. a 90. letech byl rozdíl považován za markantní, zvláště ve srovnání s Bourneovým shellem (také známým jako sh ), tehdy dominantním shellem, který napsal Stephen Bourne v Bell Labs . Tento příklad ilustruje konvenčnější operátory výrazu C a syntaxi .

Bourneova skořápka

#!/bin/sh
if [ $days -gt 365 ]
then
   echo This is over a year.
fi

C shell

#!/bin/csh
if ( $days > 365 ) then
   echo This is over a year.
endif

Bourneovi chyběla výrazová gramatika . Podmínka v hranatých závorkách musela být vyhodnocena pomalejším spuštěním externího testovacího programu. ifPříkaz sh vzal jeho argumentační slova jako nový příkaz, který se má spustit jako podřízený proces . Pokud by dítě vystoupilo s nulovým návratovým kódem , sh by hledalo klauzuli then (samostatný příkaz, ale často psaný spojený na stejném řádku středníkem) a spustil tento vnořený blok. V opačném případě by to fungovalo jinak. Propojení testovacího programu jako „ test“ i „ [“ poskytlo značnou výhodu hranatých závorek a zdání, že funkčnost testu byla součástí jazyka sh. Používání obráceného klíčového slova k označení konce řídicího bloku bylo stylem vypůjčeným z ALGOL 68 .

Naproti tomu csh mohl vyhodnotit výraz přímo, což ho zrychlilo. Rovněž tvrdil lepší čitelnost: Jeho výrazy používaly gramatiku a sadu operátorů převážně zkopírovaných z jazyka C, žádné z jeho klíčových slov nebylo obráceno a celkový styl byl také více podobný C.

Zde je druhý příklad porovnávající skripty, které počítají prvních 10 mocnin 2.

Bourneova skořápka

#!/bin/sh
i=2
j=1
while [ $j -le 10 ]
do
   echo '2 **' $j = $i
   i=`expr $i '*' 2`
   j=`expr $j + 1`
done

C shell

#!/bin/csh
set i = 2
set j = 1
while ( $j <= 10 )
   echo '2 **' $j = $i
   @ i *= 2
   @ j++
end

Znovu kvůli nedostatku gramatiky výrazu skript sh používá substituci příkazů a příkaz expr . (Modern POSIX shell dělá takovou gramatiku: příkaz by mohl být napsán i=$((i * 2))nebo : $((i *= 2))).

Na závěr je zde třetí příklad, který ukazuje různé styly příkazu switch .

Bourneova skořápka

#!/bin/sh
for i in d*
do
   case $i in
      d?) echo $i is short ;;
      *) echo $i is long ;;
   esac
done

C shell

#!/bin/csh
foreach i ( d* )
   switch ( $i )
      case d?:
         echo $i is short
         breaksw
      default:
         echo $i is long
   endsw
end

Ve skriptu sh ;;označuje „ “ konec každého případu, protože sh zakáže null příkazy jinak.

Vylepšení pro interaktivní použití

Druhým cílem bylo, že C shell by měl být lepší pro interaktivní použití. Představila řadu nových funkcí, které usnadnily, zrychlily a zpříjemnily používání zadávání příkazů na terminálu. Uživatelé mohli dělat věci s mnohem menším počtem stisknutí kláves a běželo to rychleji. Nejvýznamnější z těchto nových funkcí byly historie a editační mechanismy, aliasy, zásobníky adresářů, tildová notace, cdpath, řízení úloh a hašování cest. Tyto nové funkce se ukázaly jako velmi populární a mnoho z nich bylo od té doby zkopírováno jinými unixovými granáty.

Dějiny

Historie umožňuje uživatelům vyvolat předchozí příkazy a znovu je spustit zadáním pouze několika rychlých stisků kláves. Například zadání dvou vykřičníků (" !!") jako příkazu způsobí spuštění bezprostředně předcházejícího příkazu. Jiné krátké kombinace kláves, např. „ !$“ (Tj. „Poslední argument předchozího příkazu“), umožňují, aby byly kousky předchozích příkazů vloženy dohromady a upraveny za účelem vytvoření nového příkazu.

Úpravy operátorů

Úpravy lze provádět nejen v textu předchozího příkazu, ale také v proměnných substitucích. Rozsah operátorů se pohybuje od jednoduchého vyhledávání / nahrazování řetězců až po analýzu cesty k extrahování konkrétního segmentu.

Aliasy

Aliasy umožňují uživateli zadat název aliasu a nechat prostředí C jej interně rozšířit na libovolnou sadu slov, která uživatel definoval. V mnoha jednoduchých situacích běží aliasy rychleji a jsou pohodlnější než skripty.

Zásobník adresářů

Adresář stack umožňuje uživateli posunout nebo pop na aktuální pracovní adresář , což usnadňuje skočit tam a zpět mezi různými místy v souborovém systému.

Tildová notace

Tildová notace nabízí zkrácený způsob zadávání cest vzhledem k domovskému adresáři pomocí ~znaku „ “.

Dokončení názvu souboru

Klíč escape lze použít interaktivně zobrazit možná doplnění názvu souboru na konec aktuálního příkazového řádku.

Cdpath

Cdpath rozšiřuje představu vyhledávací cesty na příkaz cd(změnit adresář): Pokud zadaný adresář není v aktuálním adresáři , pokusí se jej csh najít v adresářích cdpath.

Řízení úlohy

Do osmdesátých let měla většina uživatelů pouze jednoduché terminály ve znakovém režimu, které vylučovaly více oken, takže mohli pracovat pouze na jednom úkolu najednou. Řízení úlohy prostředí C umožnilo uživateli pozastavit aktuální aktivitu a vytvořit novou instanci prostředí C nazvanou úloha zadáním ^Z. Uživatel by pak pomocí fgpříkazu mohl přepínat mezi úlohami . Aktivní úloha byla prý v popředí. O jiných úlohách se říkalo, že jsou buď pozastaveny (zastaveny), nebo běží na pozadí .

Cesta hash

Cesta hash zrychluje hledání spustitelných souborů v prostředí C shell. Spíše než provádět volání souborového systému v každém adresáři cesty, jeden po druhém, dokud nenajde soubor nebo nevyčerpá možnosti, C shell konzultuje interní hash tabulku vytvořenou skenováním adresářů cest. Tato tabulka obvykle řekne prostředí C, kde má najít soubor (pokud existuje), aniž by musel hledat, a lze jej obnovit rehashpříkazem.

Přehled jazyka

C shell pracuje po jedné lince. Každý řádek je tokenizován do sady slov oddělených mezerami nebo jinými znaky se zvláštním významem, včetně závorek, pipování a operátorů přesměrování vstupu / výstupu, středníků a ampersandů.

Základní výroky

Základní příkaz je ten, který jednoduše spustí příkaz. První slovo je bráno jako název spuštěného příkazu a může to být buď interní příkaz, např. echo, Nebo externí příkaz. Zbývající slova jsou předána jako argumenty příkazu.

Na úrovni základních příkazů jsou některé funkce gramatiky:

Zástupný znak

C shell, stejně jako všechny unixové shelly, zachází s jakýmkoli argumentem příkazového řádku, který obsahuje zástupné znaky, jako se vzorem a nahrazuje jej seznamem všech názvů souborů, které odpovídají (viz globbing ).

  • * odpovídá libovolnému počtu znaků.
  • ? odpovídá libovolnému jednomu znaku.
  • [... ]odpovídá některému ze znaků v hranatých závorkách. Rozsahy jsou povoleny pomocí pomlčky.
  • [^... ]odpovídá libovolnému znaku, který není v sadě.

C shell také představil několik značkových vymožeností (někdy známých jako rozšířené globování ), protože byly zkopírovány jinými unixovými granáty.

  • abc{def,ghi}je alternace (aka rozšíření závorky ) a rozšiřuje se na abcdef abcghi .
  • ~ znamená domovský adresář aktuálního uživatele.
  • ~userprostředek uživatele domovský adresář.

*/*.cPodporováno je několik zástupných znaků na úrovni adresáře, např. „ “.

Od verze 6.17.01 je s touto možností podporován také rekurzivní zástupný znak à la zsh (např. „ **/*.c“ Nebo „ ***/*.html“) globstar.

Dávat shellu odpovědnost za interpretaci zástupných znaků bylo důležité rozhodnutí pro Unix. Znamenalo to, že zástupné znaky budou fungovat s každým příkazem a vždy stejným způsobem. Rozhodnutí se však opíralo o schopnost Unixu efektivně předávat dlouhé seznamy argumentů prostřednictvím systémového volání exec, které csh používá k provádění příkazů. Naproti tomu v systému Windows je interpretace zástupných znaků konvenčně prováděna každou aplikací. Toto je dědictví systému MS-DOS, který umožňoval předat aplikaci pouze 128bajtový příkazový řádek, což znemožňuje použití zástupných znaků příkazového řádku systému DOS. Ačkoli moderní Windows dokáže předávat příkazové řádky až zhruba 32 kB znaků Unicode , zátěž pro interpretaci zástupných znaků zůstává u aplikace.

Přesměrování I / O

Ve výchozím nastavení, když csh spustí příkaz, příkaz zdědí popisky souboru stshio csh pro stdin , stdout a stderr , které obvykle směřují na okno konzoly, kde běží C shell. Operátoři přesměrování I / O umožňují příkazu místo toho použít soubor pro vstup nebo výstup.

  • > soubor znamená, že standardní výstup bude zapsán do souboru , přepíše jej, pokud existuje, a vytvoří jej, pokud tomu tak není. Do okna shellu stále přicházejí chyby.
  • >& soubor znamená, že do souboru se zapíše stdout i stderr , pokud existuje, přepíše jej a pokud není, přepíše se.
  • >> soubor znamená, že standardní výstup bude připojen na konec souboru .
  • >>& file znamená, že stdout i stderr budou připojeny na konec souboru .
  • < file znamená, že stdin bude načten ze souboru .
  • << řetězec je zde dokument . Stdin přečte následující řádky až po ten, který odpovídá řetězci .

Připojování

Příkazy lze spojovat na stejném řádku.

  • ; znamená spustit první příkaz a poté další.
  • &&znamená spustit první příkaz a pokud uspěje s návratovým kódem 0 , spustit další.
  • || znamená spustit první příkaz a pokud selže s nenulovým návratovým kódem, spustit další.

Potrubí

Příkazy lze připojit pomocí kanálu, což způsobí, že výstup jednoho příkazu bude přiveden na vstup dalšího. Oba příkazy běží souběžně .

  • |znamená připojení stdout k stdin dalšího příkazu. Do okna shellu stále přicházejí chyby.
  • |& znamená připojit stdout i stderr k stdin dalšího příkazu.

Současné spuštění znamená „paralelně“. V systému s více jádry (více procesory) mohou být piped příkazy doslova prováděny současně, jinak plánovač v časových řezech operačního systému mezi nimi.

Daný příkaz, např. „ a | b“, Shell vytvoří rouru , poté spustí oba aa bse stdio pro dva přesměrované příkazy, takže azapíše svůj stdout do vstupu roury, zatímco bpřečte stdin z výstupu roury. Potrubí jsou implementovány operačním systémem s určitým množstvím ukládání do vyrovnávací paměti, takže amohou chvíli zapisovat, než se potrubí zaplní, ale jakmile potrubí zaplní, jakýkoli nový zápis bude blokovat uvnitř OS, dokud nebude bdostatečně číst k odblokování nových zápisů. Pokud se bpokusí načíst více dat, než je k dispozici, bude blokováno, dokud anenapíše více dat, nebo dokud se kanál neuzavře, např a. Při ukončení.

Variabilní substituce

Pokud slovo obsahuje znak dolaru „ $“, jsou následující znaky brány jako název proměnné a odkaz je nahrazen hodnotou této proměnné. Různé editační operátory, zadané jako přípony odkazu, umožňují editaci cesty (např. " :e" Extrahovat pouze příponu) a další operace.

Cituji a unikám

Mechanismy citování umožňují jinak speciální znaky, jako jsou mezery, zástupné znaky, závorky a znaky dolaru, považovat za doslovný text.

  • \ znamená vzít další znak jako obyčejný doslovný znak.
  • "string" je slabá nabídka. Uzavřené mezery a zástupné znaky se berou jako literály, ale stále se provádějí substituce proměnných a příkazů.
  • 'string' je silná nabídka. Celý uzavřený řetězec je považován za literál.

Náhrada příkazů

Substituce příkazů umožňuje použít výstup jednoho příkazu jako argument pro jiný.

  • `příkaz` znamená převzít výstup příkazu , analyzovat jej na slova a vložit je zpět do příkazového řádku.

Provedení na pozadí

Normálně, když C shell spustí příkaz, čeká na dokončení příkazu, než dá uživateli další výzvu signalizující, že lze zadat nový příkaz.

  • příkaz & znamená spuštění příkazu na pozadí a okamžité zadání nového příkazu.

Dílčí skořápky

Subshell je samostatná podřízená kopie shellu, která dědí aktuální stav, ale poté může provádět změny, např. V aktuálním adresáři, aniž by to ovlivnilo rodiče.

  • ( commands ) znamená spouštění příkazů v subshellu.

Kontrolní struktury

Prostředí C poskytuje řídicí struktury pro testování podmínek i iteraci . Kontrolní struktury pro testování podmínek jsou příkazy if a switch. Struktury řízení iterace jsou příkazy while, foreach a repeat.

pokud prohlášení

Existují dvě formy příkazu if . Krátký formulář se zadává na jednom řádku, ale pokud je výraz pravdivý, lze zadat pouze jeden příkaz.

if ( expression ) command

Dlouhý formulář používá klíčová slova then, else a endif, aby bylo možné vnořit bloky příkazů do podmínky.

if ( expression1 ) then
    commands
else if ( expression2 ) then
    commands
    ...
else
    commands
endif

Pokud se else a pokud klíčová slova objeví na stejném řádku, csh řetězy, spíše než je hnízdit; blok je zakončen jediným endifem.

příkaz switch

Příkaz switch porovnává řetězec se seznamem vzorů, které mohou obsahovat zástupné znaky. Pokud se nic neshoduje, provede se výchozí akce, pokud existuje.

switch ( string )
    case pattern1:
        commands
        breaksw
    case pattern2:
        commands
        breaksw
        ...
    default:
        commands
        breaksw
endsw

zatímco prohlášení

Příkaz while vyhodnotí výraz. Pokud je to pravda, shell spustí vnořené příkazy a poté se opakuje tak dlouho, dokud výraz zůstane pravdivý.

while ( expression )
    commands
end

prohlášení foreach

Příkaz foreach přebírá seznam hodnot, obvykle seznam názvů souborů vytvořených zástupnými znaky, a poté pro každou nastaví proměnnou smyčky na tuto hodnotu a spustí vnořené příkazy.

foreach loop-variable ( list-of-values )
    commands
end

opakovat prohlášení

Příkaz opakování opakuje jeden příkaz celkově několikrát.

repeat integer command

Proměnné

C shell implementuje proměnné prostředí i prostředí . Proměnné prostředí, vytvořené pomocí setenvpříkazu, jsou vždy jednoduché řetězce předávané jakýmkoli podřízeným procesům , které tyto proměnné načítají pomocí envp[]argumentu main().

Proměnné prostředí, vytvořené pomocí příkazů setnebo @, jsou interní v prostředí C prostředí. Nejsou předávány podřízeným procesům. Proměnné prostředí mohou být jednoduché řetězce nebo pole řetězců. Některé z proměnných prostředí jsou předdefinovány a používají se k ovládání různých interních možností prostředí C, např. Co by se mělo stát, pokud se zástupnému znaku nepodaří nic přiřadit.

V aktuálních verzích csh mohou mít řetězce libovolnou délku až do milionů znaků.

Výrazy

C shell implementuje 32bitovou celočíselnou výrazovou gramatiku s operátory vypůjčenými z C, ale s několika dalšími operátory pro porovnávání řetězců a testy souborového systému, např. Testování existence souboru. Operátoři musí být od svých operandů odděleni mezerou. Na proměnné se odkazuje jako na $jméno .

Priorita operátora je také vypůjčena z jazyka C, ale s různými pravidly asociativity operátorů k vyřešení nejednoznačnosti toho, co je v pořadí operátorů se stejnou prioritou první. V C je asociativita pro většinu operátorů zleva doprava; v prostředí C shell je zprava doleva. Například,

// C groups from the left
int i = 10 / 5 * 2;
printf( "%d\n", i ); // prints 4
i = 7 - 4 + 2;
printf( "%d\n", i ); // prints 5
i = 2 >> 1 << 4;
printf( "%d\n", i ); // prints 16
# C shell groups from the right
@ i = 10 / 5 * 2
echo $i # prints 1
@ i = 7 - 4 + 2
echo $i # prints 1
@ i = ( 2 >> 1 << 4 )
echo $i # prints 0

Závorky v příkladu C shellu mají zabránit tomu, aby operátoři posunutí bitů byli zaměňováni za operátory přesměrování I / O. V obou jazycích lze vždy použít závorky k explicitnímu určení požadovaného pořadí vyhodnocení, i když pouze pro přehlednost.

Recepce

Ačkoli Stephen Bourne sám uznal, že csh byl lepší než jeho shell pro interaktivní použití, nikdy to nebylo tak populární pro skriptování. Zpočátku a přes 80. léta nebylo možné zaručit, aby byl csh přítomen na všech unixových systémech, ale sh mohl, což z něj dělalo lepší volbu pro všechny skripty, které by mohly běžet na jiných strojích. V polovině 90. let byl csh široce dostupný, ale použití csh pro skriptování čelilo nové kritice výboru POSIX , který stanovil, že by měl existovat pouze jeden preferovaný shell, KornShell , pro interaktivní i skriptovací účely. C shell také čelil kritice ostatních kvůli údajným defektům C syntaxe, chybějícím funkcím a špatné implementaci.

  • Vady syntaxe: byly obecně jednoduché, ale zbytečné nesrovnalosti v definici jazyka. Například set, setenva aliaspříkazy všichni udělali v podstatě to samé, totiž spojit název s řetězem nebo sadou slov. Ale všichni tři měli drobné, ale zbytečné rozdíly. Rovné znaménko bylo požadováno pro, setale ne pro setenvnebo alias; byl vyžadován závorek seznamu slovo pro set, ale ne pro setenvnebo alias, atd. Stejně tak if, switchi konstrukcí cyklu, pouze zbytečně různých klíčových slov ( endif, endswa end) ukončí vnořené bloky.
  • Chybějící funkce: nejčastěji zmiňována nedostatečná schopnost samostatně manipulovat se stdio soubory a podpora funkcí. Zatímco Bournovým funkcím shellu chyběly pouze lokální proměnné, Cshovy aliasy - nejbližší analogie v Csh funkcím - byly omezeny na jednotlivé řádky kódu, i když většina konstrukcí řízení toku vyžadovala rozpoznání nových řádků. Výsledkem bylo, že skripty Csh nemohly být funkčně rozděleny, jak by mohly být samotné programy C, a větší projekty měly tendenci přecházet buď na skriptování prostředí Bourne, nebo na kód C.
  • Implementace: která použila analyzátor ad hoc, vyvolala nejvážnější kritiku. Na začátku 70. let byla technologie kompilátoru dostatečně vyspělá, že většina nových jazykových implementací používala syntaktický analyzátor shora dolů nebo zdola nahoru schopný rozpoznat plně rekurzivní gramatiku . Není známo, proč byl pro skořápku C místo toho zvolen ad hoc design. Může to být jednoduše tak, jak Joy uvedla v rozhovoru v roce 2009: „Když jsem začal dělat tyto věci s Unixem, nebyl jsem moc dobrý programátor.“ Návrh ad hoc znamenal, že jazyk prostředí C nebyl plně rekurzivní. Existoval limit, jak složitý příkaz zvládne.

Fungovalo to na většinu interaktivně zadávaných příkazů, ale u složitějších příkazů, které by uživatel mohl psát ve skriptu, by to mohlo snadno selhat a vytvořit pouze záhadnou chybovou zprávu nebo nevítaný výsledek. Například shell C nemohl podporovat potrubí mezi řídicími strukturami. Pokus o propojení výstupu foreachpříkazu grepjednoduše nefungoval. (Řešení, které funguje u mnoha stížností souvisejících s analyzátorem, je rozdělit kód do samostatných skriptů. Pokud foreachje přesunut do samostatného skriptu, funguje piping, protože skripty jsou spouštěny rozvětvením nové kopie csh. který zdědí správné stdio úchyty.)

Dalším příkladem je nevítané chování v následujících fragmentech. Zdá se, že oba znamenají: „Pokud soubor„ myfile “neexistuje, vytvořte jej tak, že do něj napíšete„ mytext “.“ Verze vpravo však vždy vytvoří prázdný soubor, protože pořadí vyhodnocení prostředí C shell je hledat a vyhodnocovat operátory přesměrování I / O na každém příkazovém řádku při jeho čtení, než prozkoumá zbytek řádku a zjistí, zda obsahuje kontrolní struktura.

# Works as expected
if ( ! -e myfile ) then
   echo mytext > myfile
endif
# Always creates an empty file
if (! -e myfile) echo mytext > myfile
# Workaround
if (! -e myfile) eval "echo mytext > myfile"

Implementace je také kritizována za své notoricky špatné chybové zprávy, např. „0 event not found“, což nepřináší žádné užitečné informace o problému.

Vliv

64bitový shell Hamilton C na ploše Windows 7 .

C shell byl mimořádně úspěšný při zavádění velkého množství inovací včetně mechanismu historie , aliasů , tildové notace , interaktivního doplňování názvů souborů, gramatiky výrazů zabudovaných do shellu a dalších, které byly od té doby zkopírovány jinými unixovými shelly. Ale na rozdíl od sh , který vytvořil velký počet nezávisle vyvinutých klonů, včetně ksh a bash , jsou známy pouze dva klony csh . (Protože tcsh byl založen na kódu csh původně napsaném Billem Joyem, není považován za klon.)

V roce 1986 napsal Allen Holub On Command: Writing a Unix-Like Shell pro MS-DOS , knihu popisující program, který napsal s názvem „SH“, ale který ve skutečnosti kopíroval jazykový design a vlastnosti csh, ne sh. Doprovodné diskety obsahující úplný zdroj pro SH a pro základní sadu unixových nástrojů (cat, cp, grep atd.) Byly k dispozici od vydavatele za 25 $, respektive 30 $. Řídicí struktury, gramatika výrazu, mechanismus historie a další funkce v Holubově SH byly totožné s těmi v C shellu.

V roce 1988 začala společnost Hamilton Laboratories dodávat shell Hamilton C pro OS / 2 . Zahrnoval klon csh i sadu nástrojů podobných Unixu. V roce 1992 byl Hamilton C shell vydán pro Windows NT . Verze pro Windows je nadále aktivně podporována, ale verze pro OS / 2 byla ukončena v roce 2003. Rychlá reference z počátku roku 1990 popsala záměr jako „úplnou shodu s celým jazykem prostředí C (kromě řízení úloh )“, ale s vylepšením designu jazyka a přizpůsobení rozdílům mezi Unixem a PC. Nejdůležitějším vylepšením byl syntaktický analyzátor shora dolů, který umožňoval vnořovat nebo propojovat řídicí struktury , něco, co původní C shell nemohl podporovat, vzhledem k jeho analyzátoru ad hoc. Hamilton také přidal nové jazykové funkce včetně vestavěných a uživatelem definovaných postupů, lokálních proměnných s blokovou strukturou a aritmetiky s plovoucí desetinnou čárkou. Přizpůsobení na PC zahrnovalo podporu názvu souboru a dalších konvencí na PC a použití vláken místo forků (které nebyly k dispozici pod OS / 2 nebo Windows), aby se dosáhlo paralelismu , např. Při sestavování kanálu.

Viz také

Reference

Další čtení

externí odkazy