next up previous contents
Nästa: 3.4 Beskydd Upp: 3. Kommandotolken Förra: 3.2 Jobb

3.3 In- och utdata

Information och data kan skickas till ett program medan det kör. Programmet kan också skicka ut data. För att kunna hantera flödet av data har varje programkörning tre informationskanaler: standard indata, standard utdata och standard felmeddelanden. Vi ska nu berätta hur man med hjälp av skalet kan hantera dessa kanaler.

Det som skrivs ut efter att man gett ett kommando kallas för kommandots utdata. Vanligtvis skrivs utdatan direkt till skärmen, men det händer ibland att man vill spara den i en fil. Detta är lätt gjort: man skriver bara ''> filnamn'' någonstans i kommandot, lämpligen i slutet av det.$ date
tor feb  5 16:36:00 CET 1998
$ date > datum
$ ls
bellman   datum     dikter/   lenngren
$ cat datum
tor feb  5 16:36:08 CET 1998
$
Ovan lät jag först date skriva ut tid och datum. Som vanligt kom utskriften direkt på skärmen. Sedan körde jag date igen, men med utdatan riktad till filen datum. Därefter hade jag fått en fil med namnet datum, och vid en kontroll med cat såg jag att utskriften från date hade hamnat där.

Vi ger ännu ett exempel:$ echo Hej > hejfil
$ ls
bellman   datum     dikter/   hejfil    lenngren
$ cat hejfil
Hej
$
Jag lät här echo skriva ordet ''Hej'' till en fil med namnet hejfil.

Man kan ''slå ihop'' två eller flera filer genom att låta cat skriva ut deras innehåll medan utdatan är riktad till en ny fil.$ cat hejfil datum > nyfil
$ ls
bellman   datum     dikter/   hejfil    lenngren  nyfil
$ cat nyfil
Hej
tor feb  5 16:36:08 CET 1998
$
Om man använder > filnamn för att styra utdatan från något kommando till en existerande fil filnamn, så raderas innehållet i denna fil innan utdatan skrivs till den.$ date > nyfil
$ cat nyfil
tor feb  5 16:55:27 CET 1998 
$
Filens nuvarande innehåll behålls, och kommandots utdata läggs till på slutet, ifall man skriver >> i stället för >:$ echo och hå. >> hejfil
$ cat hejfil
Hej
och hå.
$

Det är skillnad mellan ett kommandos utdata och dess eventuella felmeddelanden. Vill man skicka felmeddelandena till en fil, så ska man skriva 2> fil i stället för bara > fil.$ cp datum
cp: destinationsfil saknas
Försök med "cp --help" för mer information.
$ cp datum > utdata
cp: destinationsfil saknas
Försök med "cp --help" för mer information.
$ cat utdata
$ cp datum 2> utdata
$ cat utdata
cp: destinationsfil saknas
Försök med "cp --help" för mer information.
$
Först gav jag det ofullständiga kommandot cp datum, och fick genom ett felmeddelande påpekat för mig att kommandot var felaktigt. Därefter försökte jag dirigera om utdatan till filen utdata, men detta påverkade inte felmeddelandet. I tredje försöket lyckades jag däremot få felmeddelandet att hamna i filen utdata genom att använda 2> i stället för >.

Från vissa kommandon kan det komma både utdata och felmeddelanden. Man kan då skicka utdatan åt ett håll och felmeddelandena åt ett annat.$ wc lenngren bellmna
     19     118     649 lenngren
wc: bellmna: Filen eller katalogen finns inte
     19     118     649 total
$ wc lenngren bellmna > utdata 2> felmeddelande
$ cat utdata
     19     118     649 lenngren
     19     118     649 total
$ cat felmeddelande
wc: bellmna: Filen eller katalogen finns inte
$
Ovan ''råkade'' jag stava ett filnamn fel. Först behandlar wc filen lenngren, därefter skrivs ett felmeddelande ut, och sedan ges en sammanfattning. Jag körde därefter samma kommando igen, med utskriften riktad till filen utdata och felmeddelandena riktade till filen felmeddelande och kontrollerade att allting hade hamnat rätt.

Om utdatan och felmeddelandena ska hamna på samma ställe, så ska man omdirigera dem med tecknen >&:$ wc lenngren bellmna >& båda
$ cat båda
     19     118     649 lenngren
wc: bellmna: Filen eller katalogen finns inte
     19     118     649 total
$
Här körde jag kommandot ytterligare en gång, med utskrift och felmeddelanden riktade till filen båda.

I vissa kommandon förekommer sekvenser i stil med 2>&1, som riktar felmeddelandena åt samma håll som utskriften är riktad åt. Tecknen &1 kan läsas som ''den plats som utdatan just nu skickas till''. Siffran 1 är associerad med standrad utdata, siffran 2 med standard felmeddelanden och siffran 0 med standard indata. Vi kommer dock inte att ha användning för detta förrän i de senare kapitlen.

Till vissa kommandon får man skriva in text, som då kallas för indata till kommandot. Så är exempelvis fallet med wc om man inte anger något filnamn:$ wc
nu ska
vi se vad som händer.          Här trycker jag C-d
      2       7      29
$
Indatan till kommandot ovan är de två raderna text, som jag skrev in vid tangentbordet. Man markerar att indatan är slut genom att antingen trycka C-d i början av en rad eller trycka C-d två gånger i följd. Men var försiktig: om man trycker C-d när skalet förväntar sig ett kommando, så finns det risk för att man blir utloggad - skalet tror ju då att det är slut på dess indata, kommandona! Utdatan från wc är raden som innehåller siffrorna 2, 7 och 29. Många andra kommandon än wc, tex cat och more, väljer också att vänta på indata om man inte anger något filnamn.

Vill man att indatan ska komma från en fil istället för att matas in från tangentbordet, så skriver man bara ''< filnamn'' före eller efter kommandot.$ wc < bellman
     12      71     372
$ wc bellman
     12      71     372 bellman
$
Kan du se skillnaden mellan de båda kommandona?

Hur många tecken använder date för att ange dagens datum? Vi kan ta reda på detta genom att använda wc på filen datum (naturligtvis orkar vi inte själva räkna tecknen). Alltså: först kör man date och sparar undan dess utdata i en fil, och sedan kör man wc på denna fil. Om det bara är slutresultatet man är intresserad av, så känns det kanske onödigt att gå omvägen via en fil; man vill att utdatan från date ska gå direkt till wc. Detta kan man uppnå genom att skriva ett lodrätt streck, tecknet |, mellan kommandona; då skickar skalet utdatan från första kommandot som indata till det andra.$ wc datum
      1       6      30 datum
$ date | wc
      1       6      30
$

En följd av kommandon som är sammankopplade med | kallas för en rörledning. Rörledningar är utomordentligt användbara. Till exempel, om utdatan från ett kommando är för lång för att få plats på skärmen så att man inte hinner läsa den innan den försvunnit, så kan man låta den gå genom more.$ ls -l /bin | more
-rwxr-xr-x   1 root     root        23968 maj  5 01:36 ae*
-rwxr-xr-x   1 root     root         2716 maj  7 19:32 arch*
-rwxr-xr-x   1 root     root       325548 aug 15 18:56 bash*
-rwxr-xr-x   1 root     root       318612 jun 10 13:00 bash2*
-rwxr-xr-x   1 root     root         9104 maj  9 01:06 cat*
-rwxr-xr-x   1 root     root         9836 maj 10 01:46 chgrp*
-rwxr-xr-x   1 root     root        10348 maj 10 01:46 chmod*
-rwxr-xr-x   1 root     root         9652 maj 10 01:46 chown*
-rwxr-xr-x   1 root     root        23200 maj 10 01:46 cp*
-rwxr-xr-x   1 root     root        46712 feb 25  1997 cpio*
-rwxr-xr-x   1 root     root        23232 maj 30 20:58 date*
--More--

Nu återstår det bara att städa upp efter oss...$ rm datum felmeddelande utdata båda hejfil nyfil
$


next up previous contents
Nästa: 3.4 Beskydd Upp: 3. Kommandotolken Förra: 3.2 Jobb
Goran Andersson
1999-03-08