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
$