Boken Om Linux/Kapittel 9
9: Omdirigering, rør og filtre
[rediger]Standard inn-, ut- og feildata
[rediger]Data til et program eller en kommando hentes fra inndata. Tastaturet er vanligvis standard inndata (0). Det betyr at hvis ikke noe annet er bestemt, hentes dataene fra tastaturet. Standard utdata (1) er som regel skjermen. Et program eller en kommando kan også sende dataene bl.a. til en harddisk, skriver, diskettstasjon eller magnetbånd (tape). Men hvis ikke annet er bestemt, sendes dataene til skjermen. Ved feil blir det skrevet ut en feilmelding, og om ikke noe annet er spesifisert, blir denne meldingen sendt til standard feildata (2). For å skille mellom standard inndata, utdata og feildata har man tildelt tre filindikatorer:
0 standard inndata (stdin)
1 standard utdata (stdout)
2 standard feildata (sterr) Filindikatorene kan betraktes som et siffer som du kan knytte til en datafil. Du kan omdirigere både inndata, utdata og feildata til forskjellige fysiske enheter. Utdata kan for eksempel omdirigeres en fil, en skriver, en annen terminal, etc. Jeg kan omdirigerer data til forskjellig forskjellige fysiske enheter (disk, bånd). Dette gjør jeg ved å dirigere dataene til spesielle filer som er tilknyttet de forskjellige enhetene. Man kaller disse filene for styreprogrammer (devicedrivere). De ligger i katalogen /dev. For eksempel representerer /dev/tty5a en terminal, og /dev/lp1 kan representere parallellporten på din Linux-maskin. Omdirigering kan også endre filindikatorene som en prosess har. Ved hjelp av rør (pipe) kan dataene fra en prosess sendes rett over til en annen prosess for viderebehandling. Jeg kommer tilbake til dette senere.
Kommando/operasjon | Beskrivelse |
kommando > fil | sender standard utdata til fil |
kommando >>fil | adderer standard utdata til fil |
kommando 2>fil | sender standard feildata til fil |
kommando 2>>fil | adderer standard feildata til fil |
kommando < fil | leser standard inndata fra fil |
kommando <<ord | leser standard inndata fra alle kommando- linjer inntil ord (Se også kapittel 16) |
kommando.2 | resultatet av kommando.1 blir videre- behandlet av kommando.2 |
Figur 9.1: Standardenhetene
Figur 9.2: Standarddirigering av data
Fil:Standarddirigeringavdata.png
Omdirigering av standard utdata
[rediger]Symbolet < omdirigerer et programs inngående data fra en spesifisert fil i stedet for fra terminalen. Den spesifiserte filen kan være en driver for skriver, terminal, båndstasjon eller diskettstasjon.
Skrivemåte: kommando/program [argument]< fil Eksempel med cat og kommandokontroll:
[david@nittedal david]$ cat < tekstfil
Dette er et eksempel på en tekst som er skrevet med cat-kommandoen. Du kan gjøre tilsvarende i MS-DOS ved å skrive COPY CON og filnavn. I MS-DOS avslutter du med <Ctrl-z>, her avslutter du med <Ctrl-d>. cat leser fra filen tekstfil i stedet for fra standard inndata (0) som er tastaturet. Innholdet av tekstfilen kommer ut på skjermen.
Addere utdata til fil – >>
[rediger]Symbolet >> adderer informasjon på slutten av filen. De eksisterende data som ligger på filen forblir urørt.
Skrivemåte: kommando/program [argument] >> fil Eksempel:
[david@nittedal david]$ who >> data Resultatet av who-kommandoen kommer nå på slutten av filen data.
Omdirigering og feilmeldinger
[rediger]Når standard inndata er omdirigert til en fil, vil en eventuell feilmelding fremdeles komme på billedskjermen. For å omdirigere standard feildata, må jeg ta med filindikatoren i kommandoen.
I de tilfellene hvor du ønsker å registrere feilmeldinger i egne filer, bruker du notasjonen 2> for å omdirigere feilmeldingene. 1> eller bare > brukes for å fortelle hvor standard utdata skal omdirigeres. Eksempel: Jeg har to filer, minfil og superuser. Jeg har laget minfil, mens systemadministrator (root) er eier av filen /root/superuser. Jeg har ikke lese- eller skriverettigheter til denne filen. Innholdet av filen minfil består av teksten: “Her har jeg tekstfilen minfil." Jeg skriver følgende:
[david@nittedal david]$ cat minfil /root/superuser 1> filut 2> filfeil Resultatet legges i filen filut og feilmeldinger i filen filfeil. Jeg har ikke leserettigheter til filen superuser. Derfor kommer det en feilmelding som lyder:
cat: cannot open /root/superuser Denne blir lagt i filen filfeil. Filen minfil blir lagt i filut. Prøv også med kommandoen cat:
[david@nittedal david]$ cat /root/superuser
Ønsker du både standard utdata og feilmeldingen til samme fil, skriver du 2>&1. Eksempler:
[david@nittedal david]$ cat minfil /root/superuser 1> alledata 2>&1
[david@nittedal david]$ cat alledata
Her har jeg tekstfilen minfil
cat: cannot open /root/superuser
Kombinere flere kommandoer
[rediger]Ved hjelp av rør (pipe) kan du kombinere flere programmer. Resultatet fra et program sendes da til et annet program hvor det behandles videre.
Figur 9.4: Data omdirigeres Ved å bruke rør kan du kombinere mange små kommandoer til én kraftig kommando. Dermed kan du sette sammen kommandokonstruksjoner og lage egne programmer. Et rør har samme effekt som når du omdirigerer standard utdata fra et program til en fil, og deretter bruker filen igjen som standard inndata til et annet program. Man bruker symbolet | for rør. Rør er likt for alle Linux-skall.
Skrivemåte: program.1 [argumenter] | program.2 [argumenter]
Eksempler:
[david@nittedal david]$ ls | lpr -P HPlaser ls lister ut filene i hjemmekatalogen. Utdata fra ls blir sendt videre til programmet lpr som skriver listen ut på skriveren.
[david@nittedal david]$ ls > tmp; lpr -P HPlaser tmp; rm tmp Alternativet til rør i dette eksemplet hadde vært de tre kommandoene over.
[david@nittedal david]$ ls -la | wc -l Først får jeg listet opp innholdsfortegnelsen, deretter teller wc-kommandoen antall linjer.
[david@nittedal david]$ cal | lpr Kalenderlisten blir sendt til skriver.
[david@nittedal david]$ du | wc -w Antall ord fra du-kommandoen blir telt opp av wc-komandoen.
[david@nittedal david]$ ls -la | more Denne kombinasjonen gir et filter som viser ett skjermbilde om gangen.
[david@nittedal david]$ sort liste | uniq | lpr Her sorteres en fil med navnet liste. Alle unike linjer blir plukket ut og sendt til skriver. De forskjellige kommandoene er beskrevet i kapittel 12, 13 og 14.
[david@nittedal david]$ ls -l /dev | sort -n +3 Her sorteres resultatet fra ls-kommandoen.
[david@nittedal david]$ cat /etc/passwd | wc -l > antall.brukere Her telles antall linjer i /etc/passwd-filen, og resultatet plasseres i filen antall.brukere. Alternativt kan du skrive:
[david@nittedal david]$ wc -l </etc/passwd >antall.brukere Her leser kommandoen wc -l fra standard inndata (0), som er /etc/passwd, og sender resultatet til standard utdata (1), som er filen antall.brukere. Du kan også skrive:
[david@nittedal david]$ wc -l >antall.brukere </etc/passwd
Oppgaver til kapittel 9
[rediger]Oppgave 9.1
Hva skjer hvis du bare gir kommandoen cat? Opprett en fil ved hjelp av cat-kommandoen og bruk omdirigering av standard utdata (>).
Oppgave 9.2 Prøv noen enkle Linux-kommandoer med omdirigering av standard inndata og utdata. Prøv omdirigering av data og feilmeldinger til forskjellige filer og til samme fil.
Oppgave 9.3 Kombiner kommandoene ls og wc med rør. Hva er det egentlig som skjer når du bruker rør (|)?
Oppgave 9.4 Hvorfor gir ikke de to eksemplene nedenfor det samme resultatet?
1) ls > tmpfil; wc -l tmpfil; rm tmpfil 2) ls | wc -l
Oppgave 9.5 Foreslå en liten endring i oppgave 9.4 slik at begge eksemplene får det samme resultatet.
Oppgave 9.6
Hvor mange normale filer finnes det i /dev-katalogen? (Tips: Se kapittel 13: ls -l /dev | grep {{{^}}}- | wc -l.)