Skalet sh

Översikt, 11: Kommandofiler (script files)

Förutom att ge direkta kommandon till skalet kan man även samla kommandon i filer och sedan använda dessa filer som nya kommandon. Man kan i enkla fall tänka sig att bara koppla skalets standard input till en fil som innehåller kommandon, och låta skalet läsa kommandon därifrån, men då råkar man ut för en del komplikationer. Bland annat blir ju standard input-filen då upptagen med att läsa kommandon, och kan inte användas för att hämta inmatning från användaren. Därför (och av andra anledningar) fungerar kommandofiler inte riktigt på det sättet, även om grundprinciperna är desamma.

Kommandofiler sköts istället ungefär som om de vore egendefinierade funktioner, med den skillnaden att de finns definierade i filer med samma namn som kommandot. I likhet med funktioner kallas argumenten för "$1", "$2", och så vidare.

Kommandofiler ska normalt ha en första rad som ser ut något i stil med

   #! /bin/sh
som markerar vilket program som ska användas för att tolka kommandofilen. "/bin/sh" kan ersättas med vilket annat programnamn som helst, men då blir det förstås inte en sh-kommandofil längre, utan en kommandofil för det andra program man valt. Efter första raden följer rader med vanliga kommandon.

Med undantag för första raden, där tecknen "#!" används för att markera kommandotolkens namn, så betyder tecknet "#" i en kommandofil att resten av raden som tecknet står på är kommentarer (om inte tecknet står inne i en citering eller liknande).

Bortsett från att inmatningen kommer från en fil istället för från tangentbordet, så fungerar kommandofiler i stort sett på samma sätt som om kommandona skrivits in direkt (förutsatt att man har angivit "/bin/sh" som tolk).

En finess som man kan ha särskild nytta av i kommandofiler är en speciell variant på omdirigering av inmatning, nämligen så kallade "here documents". Det fungerar så att man anger "<<slutmärke" som omdirigering, så läser skalet själva kommandofilen från och med nästa rad, fram till (men inte med) närmaste rad som innehåller texten som angivits som slutmärke, och ger detta som standard input till kommandot ifråga. Därefter, från och med raden efter slutmärkesraden, fortsätter skalet att läsa kommandon från filen.