# Shell (informatica)

Een shell is een interactief computerprogramma waarmee een gebruiker met een command-line-interface opdrachten kan geven aan het besturingssysteem van een computer.
Van oudsher wordt hierbij gebruikgemaakt van een terminal die de invoer van de gebruiker aan het besturingssysteem doorgeeft en de uitvoer dan weer aan de gebruiker doorgeeft. Op grafische desktopsystemen is doorgaans een terminalemulator aanwezig en het is dan van belang om hierbij onderscheid te maken tussen de terminalemulator en de shell zelf. Het doorgeven van de invoer en uitvoer van de grafische interface naar de shell gebeurt door middel van de terminalemulator. Bekende terminalemulators zijn XTerm en ATerm.
In Windows is er geen scheiding tussen de terminalemulator en de shell. Onder de meeste Microsoft Windowsversies kunnen zowel de terminalemulator als de bijbehorende shell worden benaderd door het programma cmd of command te starten. Deze shell is ongeveer gelijk aan de shell in DOS die COMMAND.COM heet. Onder Unix (en daarmee Linux) is die scheiding er wel en kunnen verschillende shells worden gebruikt op dezelfde terminal(emulator). Bekende shells onder UNIX zijn sh, csh, ksh en bash.

## Activiteiten

Om te begrijpen wat een shell precies doet, volgt hieronder een beschrijving van wat de Bash-shell ongeveer doet wanneer deze wordt opgestart:
* Zoek in de algemene systeemconfiguratiedirectory (/etc) naar het bestand profile en voer dit uit. (In het bestand profile zijn configuratie-instellingen te vinden die voor iedereen gelden. Voorbeelden hiervan zijn het instellen van het PATH en terminalinstellingen voor gebruikers.)
* Zoek in de thuisdirectory van de gebruiker naar het bestand .profile en voer de opdrachten hierin uit. (Gebruikers kunnen in dit bestand hun persoonlijke instellingen opslaan. Zo kunnen ze hun eigen commando's als aliassen opnemen of bepaalde omgevingsvariabelen instellen.)
* Laat de gebruiker een prompt zien waarin hij commando's uit kan voeren. Afhankelijk van de instellingen kunnen ook de volgende zaken worden geregeld:
** Sla de uitgevoerde commando's op in de homedirectory van de gebruiker in het bestand .history
** Controleer of het door de gebruiker ingetikte commando door de shell (zie shell builtin) of door een extern programma moet worden uitgevoerd
** Laat de uitvoer van het ingevoerde commando zien aan de gebruiker
Het laten zien van de prompt (en de subactiviteiten die hieronder vallen) wordt continu herhaald totdat de gebruiker de shell afsluit (vaak met het commando 'exit' of door het tikken van een 'end-of-file'-karakter (meestal control-D)).

## Shellscripts

Shellscripts zijn niets meer dan achter elkaar uitgevoerde commando's. In Microsoft Windows worden deze shellscripts dan ook 'batchbestanden' genoemd. Een shellscript wordt regel voor regel uitgevoerd door de interpreter (in dit geval de shell). Een voorbeeld van een shellscript is de volgende alias:
Met dit shellscript kan gezocht worden naar bestanden die beschrijfbaar zijn voor iedereen. Dit wordt in een grafisch aantrekkelijke interface gegoten. Dit shellscript kan eenvoudiger gelezen worden indien er wat newlines zouden zijn toegevoegd. Dan wordt ook duidelijk dat deze regel slechts een opeenvolging van commando's is:
Bovenstaande is een stuk duidelijker te lezen en onthult dat dit shellscript slechts een aantal commando's achter elkaar uitvoert:
('for' is een zogenaamde builtin; een commando dat niet door een extern programma, maar door de shell zelf wordt uitgevoerd. Dit bevordert de snelheid van de uitvoering.) Voer het volgende stuk code uit voor ieder bestand in de huidige directory (en sla voor iedere iteratie de bestandsnaam op in de variabele genaamd 'i').
Vertel de gebruiker wat we momenteel doen (de inhoud van de variabele genaamd '$i').
Roep het eigenlijke programma 'find' aan met als argument het huidige bestand '$i' en nog wat parameters.
Beëindig de 'for'-loop.

## Diverse shells
### Bourne-shell (sh)

De Bourne-shell of sh werd ingevoerd in 1977 op UNIX versie 7. Het is ontwikkeld door Stephen Bourne die bij AT&T Bell Laboratories werkte. Deze shell heeft veel invloed gehad op alle shells die na die tijd zijn ontstaan inclusief de shell in DOS en Windows.
De belangrijkste verbeteringen ten opzichte van voorgaande shells waren:
* meer en langere parameters mogelijk
* omgevingsvariabelen
* redirectie van foutmeldingen mogelijk
* meer mogelijkheden voor scripting
* ALGOL-achtige controlestructuren zoals
** if ~ then ~ else ~ fi
** case ~ in ~ esac
** while ~ do ~ done

### C-shell (csh)

De C-shell (csh) werd ingevoerd met 4.1BSD. Het grootste voordeel van deze shell is dat het voorzieningen had voor het beheer van jobs. Zo was het mogelijk om een proces dat op de achtergrond loopt naar voren te halen zodat het bijvoorbeeld afgebroken of gepauzeerd kon worden. Een groot verschil met de Bourne-shell is dat de C-shell een syntaxis gebruikt die lijkt op de programmeertaal C.

### Korn-shell (ksh)

De Korn-shell (ksh) is in 1983 geschreven door David Korn. Deze shell was een mix van de Bourne-shell en de C-shell. Hij was compatibel met de syntaxis van de Bourne-shell en had de jobcontrolefunctionaliteit van de C-shell. Verder had deze shell een eenvoudige commandoregeleditor.

### Bourne Again-shell (bash)

De Bourne Again-shell (bash) is ontwikkeld in het GNU-project en combineerde de functionaliteit van de Bourne-shell, C-shell en de Korn-shell.

### DOS-shell (COMMAND.COM) en Windows-shell (CMD.EXE)

De DOS-shell is een zeer versimpelde uitvoering van de Bourne-shell. Hij is geschikt voor het opstarten van commando's en het maken van eenvoudige scripts. De DOS-shell (in combinatie met de standaardcommando's in DOS) mist vele eigenschappen waardoor hij niet gebruikt kan worden voor iets ingewikkelder scripts. Zo mist hij bijvoorbeeld vele commando's en controlestructuren. De Windows-shell is in grote lijnen niet anders dan de DOS-shell.

### Windows Powershell

Windows Powershell is de vervanging van CMD.EXE die geleverd wordt met de .NET omgeving voor Windows. In tegenstelling to CMD.EXE is deze shell zeer krachtig, onder andere doordat hij toegang heeft tot een groot deel van de standaard .NET functionaliteit.

## Aanverwante onderwerpen

* Besturingssysteem
* Scripttaal