Skalet sh

Översikt, 2: standardfiler och omdirigering

Under Unix har varje process som startas tre stycken "standardfiler" öppna: standard input, standard output och standard error. I vanliga fall är standard input det som skrivs in från tangentbordet, och standard output och standard error skickar vidare det som skrivs på dem till skärmen. Ibland vill man hämta inmatning från eller skicka utmatning till andra ställen, vanligtvis en fil, och det gör man med så kallad omdirigering (redirection). För att omdirigera "standard input" och "standard output" anger man ett "<infil" respektive ">utfil" före, efter eller emellan argumenten till ett kommando, så tar skalet hand om detta och utför omdirigeringen innan själva kommandot utförs. (Det traditionella, och lättlästa, är att skriva omdirigeringen direkt efter kommandonamnet, före alla argument.)

När man dirigerar om utmatning till en fil skapas en fil som bara innehåller utmatningen; fanns det en annan fil med samma namn innan, så försvinner det gamla innehållet i den. Ibland vill man istället behålla det gamla innehållet och lägga till den nya utmatningen i slutet på filen. Detta markerar man med ">>utfil".

Man kan omdirigera både in- och utmatningen hos samma kommando, och det spelar ingen roll var bland argumenten till kommandot som angivelsen om omdirigering skrivs. Ordningen spelar i normala fall ingen roll, men den kan spela roll i specialfall som när man omdirigerar en standardfil till en annan.

Några exempel:

   echo >HEJFIL Hej       Skriver ut ordet Hej till filen
                          HEJFIL
      
   wc <HEJFIL             Räknar tecken, ord och rader i
                          filen HEJFIL

Hur det fungerar

Under Unix har varje process en lista över öppna filer, och för det enskilda programmen ser det ut som om filerna motsvaras av ett heltal från 0 och uppåt. Detta heltal kallas för en fildeskriptor.

När en ny process startas ärver den alla fildeskriptorer från förälderprocessen, med undantag för de deskriptorer som speciellt markerats att inte ärvas. Vad gäller skalet så finns det vanligtvis bara tre öppna filer som ärvs: standard input (deskriptor 0), standard output (deskriptor 1) och standard error (deskriptor 2). Vad skalet gör när man dirigerar om in- och utmatning är helt enkel att stänga en av dessa tre standardfiler och öppna en annan fil som ersättning för den stängda precis innan kommandot startas.