Úvod

V tomto referátu se blíže seznámíte s linuxovými shelly. Shell je vlastně program, který využívá uživatel, pro snadnější práci s kernelem. Zběžně popíši jejich historii, rozdíly a nejvíce se budu věnovat csh. Na c shellu podrobněji popíši jak jeho klady, tak zápory. Představím také dvě knihovny, které jsou pro práci v shellu velmi užitečné. Jedná se o Readline a History library. Obě slouží u usnadnění editace příkazové řádky a také k snadnějšímu a rychlejšímu používání shellu. (tedy nejen shellu, obě knihovny se dají použít pro jakýkoliv program)

Shelly

Csh/tcsh

knihovny

Zdroje

Shells

Historie

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á. Vyvoj shellu v grafice

Krátký popis shellů:

Bourne shell (sh)

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.

C shell (csh)

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.

Korn shell (ksh)

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.

tcsh

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.

Bourne again shell (bash)

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.

Zsh

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.

Okrajové shely

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.
->

Csh/tcsh

Csh - Proč ano?

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.

Csh - Proč ne?

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
Reset tty pgrp from 9341 to 26678

% alias lu 'ls -u'
% repeat 3 lu
lu: Command not found.
lu: Command not found.
lu: Command not found.
% time lu
lu: Command not found.

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ě

Readline library

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"

History library

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ávěr

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.

Zdroje:

Valid XHTML 1.0!