sh vs bash : en sammanfattning
Om du läser det här är chansen stor att du har stött på termerna shell, sh, bash etc. i det förflutna. Dessa termer kan låta förvirrande och eftersom de är nära besläktade gör det problemet ännu värre. Därför bestämde jag mig för att skriva det här inlägget med syftet att försöka förklara skillnaderna mellan dem.
Shell vs Kernel
Innan vi går vidare är det viktigt att vi förstår vad termerna shell och kernel betyder.
Kernel
Kärnan är navet i operativsystemet. Den är ansvarig för att göra saker som att interagera med maskinvara, göra fil I/O och starta processer.
Shell
Shell fungerar som ett gränssnitt mellan användaren och kärnan. Tekniskt sett är ett skal en kommandoradstolkare, dvs. det program som antingen tolkar det kommando du anger i din terminalemulator (interaktivt läge) eller bearbetar skalskript (textfiler som innehåller kommandon).
När vi nu har en uppfattning om vad skalet och kärnan är kan vi försöka förstå sh och Bash.
sh
Strängt taget är sh (eller Shell Command Language) ett programmeringsspråk som beskrivs av POSIX-standarden. Nyckeln här är att sh egentligen inte är ett programmeringsspråk i sig självt. Det är bara en specifikation. Specifikation är en detaljerad beskrivning av syntaxen och semantiken för det språket. Specifikationen omfattar inte en implementering.
Bash
Det finns olika operativsystem med egna skal och kärnor. Bash är skalet för operativsystemet GNU. Men vi kan också säga att bash är ett programmeringsspråk.
Vänta, är det inte förvirrande? Är bash både ett skal och ett programmeringsspråk?
Tänk på python. Vi kan också starta Python i interaktivt läge och det beter sig som ett skal. Eller JavaScript, eller Ruby eller något annat skriptspråk.
Säger det dig något?
Bash är alltså ett programmeringsspråk som kan ses som en implementering av sh (även om det har ändrats med tiden).
För att sammanfatta är sh en specifikation, bash är implementeringen.