Počítače rozumí jakyku, který je složen z 0 a 1, ten je nazýván binárním jazykem.
Když vznikly počítače, tak se ovládaly právě pomocí tohoto jazyka. V něm bylo velice
složité něco přečíst, natož napsat. Proto v operačním systému Unix vznikl speciální
program - Shell. Shell přijímá instrukce v angličtině, a když je to povolená instrukce,
tak ji předá kernelu. Je to interaktivní program, který spouští příkazy, které čte
z input device (keyboard), nebo ze souboru. Shell ale není součást kernelu - jen ho
používá.
Jako první vznikl Bourne shell (sh), napsal ho Steven Bourne. Tento shell se vyznačoval
velice silným vestavěným jazykem, který obsahoval všechny featury, co se hodily pro tvorbu
strukturovaného programu. Mezi další jeho přednosti patří velice šikovná práce, jak se
vstupem, tak s výstupem.
Jediný jeho velký nedostatek je v tom, že sh nemá žádnou podporu interakce
s uživatelem. Tento problém se dal řešit pomocí shellových funkcí, ty ale byly přidány
později.
Csh byl shell, který byl interaktivní a navíc obsahoval dobré vlastnosti
bs. Jako první shell obsahuje jobs control a aliasing. Jeho
tvůrci udělali syntaxi podobnou programovacímu jazyku C (ve kterém je napsaný celý unix), aby
se uživatel nemusel učit úplně jinou.
Problematická je ale obsluha vstupu a výstupu, která je mnohem horší než v bs. Také
"c-like" syntaxe je spíše na škodu, protože je té "céčkové" jen podobná, někdy je stejná, jindy
zase ne. Navíc csh obsahuje obrovské množství bugů.
Po vzniku csh bylo naprosto normální, že uživatelé používali dva shelly: bs na skripty a
csh pro interakci s uživatelem.
Davidu Kornovi přišlo zbytečné a nepříjemné používat k práci dva shelly. Proto napsal
Korn shell. Spojil dobré vlastnosti předchozích shellů a přidal pár nových featur.
Tudíž to byl shell, ve kterém se dali programovat skripty i interakce s uživatelem.
Syntaxi má odvozenou od Bourne shellu. Shelly se obecně dělí na dvě skupiny. Jedna má
syntaxi odvouzenou od Bourne shellu a druhá od csh.
Jedinou nevýhodou ksh bylo to, že nebyl zadarmo! Později sice vznikl pdksh, ale
ten se neprosadil.
Tento shell je vlastně další verze csh. T před csh znamená : TENEX-style completion.
Zde jsou opraveny některé bugy a je přidána možnost editovat příkazovou řádku.
Problémem tohoto shellu bylo to, že firmy, které vyráběli unixové systémy, dále zařazovaly
csh a nikoliv tcsh.
GNU chtělo nový shell, který by vycházel z bs a neměl jeho problémy. A navíc by byl zadarmo. Proto vzniknul bash - což je v současnosti drtivě nejpoužívanější shell na unixu/linuxu.
Tento shell napsal Paul Falstad, když studoval na Princetonské univerzitě. Je to opět shell, který synaxí vychází z bourne shellu. Od odstatních se liší obrovským množstvím featur. Je jich tolik, že je všechny určitě nezá ani Paul F. Jestli někoho zajímá ukázka, tak se může podívat na hlavní skupiny featur.
Stand Alone Shell (Sash)
Tento shell obsahuje jen minimum nejúčinnějších příkazů, stačí jen pro základní práci.
Shell includes:
echo pwd cd mkdir mknod rmdir sync rm chmod chown chgrp touch mv ln cp cmp more exit
setenv printenv umask kill where
The Adventure shell (Adsh)
Tento "shell" je spíše pro zasmání. Je naprogramován aby vypadal jako gamebook. Místo
složitého popisování ukážu příklad:
You have entered /home/andrew. This room contains:
diary
ispell.words
as well as a passage overhead.
There are shadowy figures in the corner.
-> get zsh.faq
zsh.faq: taken
-> wake cat pscnt.sh
You awaken the cat monster:
> #!/bin/sh
>> (
>> cat $*
>> echo currentdevice /PageCount gsgetdeviceprop == flush
>> ) | gs -q -sDEVICE=bit -sOutputFile=/dev/null -r5 - | tail -1
The monster slithers back into the darkness.
->
Tento shell vznikl na universitě v Berkeley. Jeho účel byl jasný - zachovat sílu
Bourne shellu a umožnit interaktivní práci. Navíc byla přidána práce s historií
podobná jako v jazyce INTERLISP. Samozřejmě tvůrci přidali dost nových featur.
První rozdíl, kterého si všimne uživatel bashe, je prompt. V csh je to % a ne >. Když
takovýto uživatel napíše příkaz, třeba % mail BillGates "Ahoj Bille!
Jak se mas? Martin" tak se bude chovat "standartně" (pošle mail na BillGates).
Stejně pracuje většina příkazů (ls, mv, rm, ...), ale některé mají jiné argumenty.
Novinkou v csh je příkaz >#
% date ># save
To je příznak scratched file, což znamená, že nově vytvořený soubor save bude systémem
za pár dní smazán. Takže se už nestane, že bedete mít na disku spoustu pomocných souborů,
které jste zapomněli smazat.
To není zrovna velká výhoda. Tou je ale historie. Spouští se jednoduše přes !
!$ - !-historie, $-last argument - vypíše to jako echo \!\$ na monitor a spustí
poslední příkaz bez argumentů
!c - poslední příkaz co začíná na c
!cc:p - poslední příkaz co začíná na cc - vypíše ho na monitor, ale nespustí
!* - předá argumenty posledního příkazu
!! - spustí poslední příkaz
V csh je podpora aliasů. To by samo o sobě nebylo nic zajímavého, ale v době vzniku shellu to byla novinka.
Následuje příklad aliasu, který využívá i zabudované historie.
alias cd 'cd \!*;ls' - za každým cd co napíšu, alias sám sustí ještě ls
cd !*;ls - spustí cd s argumenty minulého cd a pak přidá ls
' a \ slouží k escapování metaznaků
; po prvním příkazu se spustí ještě další
U aliasů bylo v manuálu důrazné varovaní ve smyslu: Přidat jich 10-15 je v pohodě, ale 50-60 strašně
zpomalí startovaní shellu (a ten se spouští při startu systému)
Práce s argumety předávánými skriptu je podobná jako v C/C++ - jsou uložené v proměnné $argv.
Pomocí příkazu $#name můžeme zjistit kolik je v poli argv položek (argumentů).
PRIKLAD
%set argv=(a b c)
%echo $?argv
1
%echo $#argv
3
%unset argv
%echo $?argv
0
%echo $#argv
Undefine variable: argv.
Csh se dá používat pro interakci s uživatelem pomocí: "$<" - toto čeká na data z klávesnice. Ty je možno
uložit do proměnné, nebo dát jako agrument nějakému příkazu.
Samozřejmě jsou v csh také různé konstrukce typu : if, else, case, while, for, repeat, foreach, ... Jejich popisováním
se zabývat nebudu. Dá se to velice snadno najít v manuálu k csh/tcsh. K tomu se vztahují také testy:
Conditional Tests
==; equality test
!=; not equals
&&; logical and
||; logical or
To jsou asi všechny důvody proč používat csh/tcsh.
Zde popíšu, proč je programování skriptů v csh nepohodlné a nebezpečné. Vycházím z webmailové konference, kde Tom Christiansen napsal příspěvek *** CSH PROGRAMMING CONSIDERED HARMFUL ***. Odkaz na tento text je na skoro každé stránce o csh.
Programátor nemůže používat file-descriptor manipulation, což znamená přesměrovávání stdin, stdout a stderr. Vše co je povoleno je jen přesměrovat výše zmíněné do stdout. Jiná možnost není. Navíc v bashi je oblíbená konstrukce přesměrování do /dev/null. To se dá využít například, když mě nezajímá stderr, tak ho přesměruju do /dev/null, a to je ekvivalentní vymazání. V csh neexistuje způsob, jak udělat něco podobného.
V csh/tcsh je také obrovské množství bugů. A není to ten typ, co hledá zaujatý programátor několik dní. Jsou to bugy velice lehko pochopitelné i pro začátečníka v csh. Uvádím dvě chyby jednu u aliasů a druhou u příkazu time. (tyto bugy jsou přítomny v csh stále)
% time | echo
Také zde nejsou jen bugy, ale i závažné chyby v návrhu.
if ( { command1 | command2 } ) then
...
fi
Každý uživatel by očekával (tak je to samozřejmě i v bashi), že sdtout prvního příkazu půjde na vstup druhého.
Chyba - shell vypíše výstupy obou příkazů na stdout!!
Za další chybu v návrhu lze považovat neschopnost zachytit jakýkoliv jiný signál než SIGINT.
Výčet chyb a neohrabaností je silně zkrácený. Mezi jiné patří: quoty, náhodné chyby, error handling,
vyhodnocování výrazů, ... .
Nakonec uvedu ještě pár bugů:
% kill -1 `cat foo`
`cat foo`: Ambiguous.
Toto ale naopak funguje správně:
% /bin/kill -1 `cat foo`
mezery mohou ovlivnit funkčnost:
if(expr) nefunguje
if (expr) pracuje správně
Tato velice užitečná knihovna skouží k rychlému editování příkazové řádky. Její největší výhoda je
v tom, že se dá naprogramovat do jakéhokoliv programu! Je jedno, jestli jde o
bash, ftp klient nebo mail. Stačí, aby někdo předělal rozhraní, a jde to. To navíc není nic tak
složitého, každý kdo umí programovat v C a přečte si manuál, snadno implementuje tuto knihovnu
do svého programu.
Přikazová řádka se ovládá pomocí klávesových zkratek. Ty zde nebudu vůbec popisovat, protože na webu
je velice podrobný manuál jak uživatelský, tak programátorský. Nastíním jen k čemu konkrétně se
dá Readline využít.
Předně se dá po řádce pohybovat: doleva, doprava, k nejbližšímu slovu vlevo,k nejbližšímu slovu vpravo...
Je tu undo, clearscrean, history, cut/paste (zde se to nazývá Kill/Yank),....
Navíc ke každé zkratce můžete přidat číselný argument. Ten znamená kolikrát se má zkratka zopakovat
nebo slouží jako značka. Navíc, když zadáte záporný argument např.-5, tak příkaz který normálně posune kurzor o 1
znak dopdoprava - nyní posune o 5 doleva..
Readline má svůj init file. Zde si můžete nastavit vlastní zkratky pro všechny příkazy. Na konec
uvedu jeden příklad toho, co se dá napsat do init file:
C-u : ">output" - po zmáčnutí ctrl-u přidá za aktuální pozici v řádku řetězec ">output"
Tato knihovna je velice podobná historii v csh. Jak smyslem tak syntaxí. Ovládání je stejné jako
u Readline, také se dá implementovat do jakéhokoliv programu, ovládá se klávesovými zkratkami a
je k ní velmi podrobný manuál.
Nejdříve se musí historii říci, jaký řádek má použít , a to se může rozšířit i o konkrétní slovo z
řádku.
Z mého pohledu nevidím důvod používat jiný shell než bash. Ten je totiž v současné době nejběžněji používaný shell. Proto i kdybych se naučil např. zsh tak bych musel umět i bash, abych mohl pracovat také na počítači, který zsh nemá. Je samozřejmě dobře, že je možnost zkusit něco jiného, ale já ji nevyužiji.