C shell - C shell
Původní autoři | Bill Joy |
---|---|
První vydání | 1978 |
Stabilní uvolnění | 6.20.00 / 24. listopadu 2016
|
Úložiště | |
Napsáno | C |
Operační systém | BSD , UNIX , Linux , macOS |
Typ | Unix shell |
Licence | Licence BSD |
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. if
Pří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 rehash
pří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. -
~user
prostředek uživatele domovský adresář.
*/*.c
Podporová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 a
a b
se stdio pro dva přesměrované příkazy, takže a
zapíše svůj stdout do vstupu roury, zatímco b
př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 a
mohou chvíli zapisovat, než se potrubí zaplní, ale jakmile potrubí zaplní, jakýkoli nový zápis bude blokovat uvnitř OS, dokud nebude b
dostatečně číst k odblokování nových zápisů. Pokud se b
pokusí načíst více dat, než je k dispozici, bude blokováno, dokud a
nenapíš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í setenv
pří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ů set
nebo @
, 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
,setenv
aalias
pří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,set
ale ne prosetenv
neboalias
; byl vyžadován závorek seznamu slovo proset
, ale ne prosetenv
neboalias
, atd. Stejně takif
,switch
i konstrukcí cyklu, pouze zbytečně různých klíčových slov (endif
,endsw
aend
) 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 foreach
příkazu grep
jednoduš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 foreach
je 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
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í
- Anderson, Gail; Paul Anderson (1986). UNIX C Shell Field Guide . Prentice-Hall. ISBN 0-13-937468-X.
- Wang, Paul (1988). Úvod do systému Berkeley UNIX . Wadsworth Pub. Co. ISBN 0-534-08862-7.
- DuBois, Paul (1995). Používání csh & tcsh . O'Reilly & Associates. ISBN 1-56592-132-1.
- Arick, Martin R. (1993). UNIX C Shell Desk Reference . John Wiley & Sons. ISBN 0-471-55680-7.
- "Úvod do programování C Shell" . Oddělení výpočetní techniky na Canisius College . Vyvolány 23 June 2010 .
externí odkazy
- Úvod do shellu C od Williama Joya .
- Linux v kostce: Kapitola 8. csh a tcsh .
- tcsh domovská stránka.
- Manuální stránka tcsh (1).
- nejnovější dostupný zdrojový kód tcsh.
- historický zdrojový kód 2BSD csh ze dne 2. února 1980.
- Strom Unixu , kompletní historické distribuce Unixu.
- Programování Csh považováno za škodlivé.
- Prvních deset důvodů, proč nepoužívat C shell.