4.6. Joker-tegn, redirection og pipes

Vi vil i dette afsnit se på et par af systemets mere smarte funktioner, som gør livet lettere for dig som bruger.

4.6.1. Joker-tegnet

Forestil dig, at du har mange filer, som du gerne vil slette. Du kan naturligvis skrive rm filnavn for hvert enkelt navn, men bare med 5-10 filer bliver du hurtigt træt af det. Redningen er joker-tegnet. Lad os antage, at du har tre filer i et katalog, og at du gerne vil slette dem alle. Nedenfor ser du hvordan.

[daisy@linus EtKatalog]$  ls
 aaa  bbb   ccc
[daisy@linus EtKatalog]$  rm *
[daisy@linus EtKatalog]$  ls
[daisy@linus EtKatalog]$ 

Alle filer er det samme som *. Hvis du i stedet havde skrevet a*, betyder det alle filer som begynder med a.

[daisy@linus NytKatalog]$  ls
 aaa  abb   ccc
[daisy@linus NytKatalog]$  rm a*
[daisy@linus NytKatalog]$  ls
 ccc
[daisy@linus NytKatalog]$ 

Stjernen, også kaldet joker-tegnet, kan bruges overalt. F.eks. betyder a*b alle filer, der begynder med a og slutter på b, hvilket vil inkludere filerne ab, aDuErGodb, men ikke en fil med navnet abe. Joker-tegnet kan bruges sammen med alle de mest almindelige kommandoer i Linux, f.eks. viser nedenstående eksempel, hvordan du viser alle filer, der begynder med ad i kataloget /usr/bin

[daisy@linus daisy]$  cd /usr/bin
[daisy@linus bin]$  ls ad*
/usr/bin/addftinfo /usr/bin/addr /usr/bin/addr2line

Det er værd at bemærke, at jokertegn ekspanderes af shellen ("kommandofortolkeren") - ikke af applikationen. Det har bl.a. den store fordel, at jokertegn altid fungerer - og fungerer konsistent på tværs af applikationer.

Et meget simpelt eksempel: Et katalog indeholder 3 filer: file1, file2 og myfile. Skriver du: ls *, vil shellen først ekspandere *-tegnet og derefter kalde ls med: ls file1 file2 myfile. Output fra ls er blot:

[daisy@linus test]$  ls
file1   file2   myfile
og ls laver således et yderst banalt arbejde.

Men der er flere muligheder i dette. Et eksempel: For at se forskellen mellem file1 og file2 kan du skrive: diff file1 file2. Men du kan også nøjes med at skrive: diff f* og således lade shellen ekspandere f* til file1 file2.

Somme tider kan denne konsekvente ekspansion af joker-tegn dog være en ulempe.

Et eksempel: Et katalog indeholder 2 filer:

[daisy@linus film]$  ls
dogme95.zip      film_index.html

Du kan også bruge zip-filer under Unix, og du kan se indholdet af zip-filen ved f.eks. at skrive:

[daisy@linus film]$  unzip -v d*
Archive:  dogme95.zip
 Length  Method   Size  Ratio   Date    Time   CRC-32     Name
 ------  ------   ----  -----   ----    ----   ------     ----
  14853  Defl:N    5224  65%  10-27-98  16:12  944a4af4   festen.html
  14844  Defl:N    5401  64%  11-14-98  19:53  e55c1636   idioterne.html
   1941  Defl:N    1024  47%  03-12-99  22:12  5ecb7d23   mifune.html
 ------          ------  ---                              -------
  31638           11649  63%                              3 files

Nu vil vi pakke festen.html ud af zip-filen. Det er den eneste fil i zip-filen, der starter med f, så under DOS kunne man blot skrive: unzip d* f*. Men prøver man det under Unix, går det galt:

[daisy@linus film]$ unzip d* f*
Archive:  dogme95.zip
caution: filename not matched:  film_index.html
Hvorfor det? Fordi der i kataloget i forvejen ligger en fil, der matcher f*, så shellen vil ekspandere både d* og f* og kalde unzip med: unzip dogme95.zip film_index.html.

Du bliver som minimum nødt til at skrive: unzip d* fe*. Der er ingen fil i kataloget, der matcher fe*, så shellen vil kun ekspandere d* og kalde unzip med: unzip dogme95.zip fe*. Det overlades nu til unzip at ekspandere fe*.

Det bør også nævnes, at mange programmer understøtter en ekstrem sej syntaks, kaldet regulære udtryk (eng. "regular expressions"), til alt inden for mønstergenkendelse af tekst, du kan f.eks. slette alle dine filer, der starter med bogstaver mellem a og g ved at skrive rm [a-g]*

Det siger vist sig selv, at du skal passe meget på, når du skal slette - for du kan ikke fortryde. Regulære udtryk er beskrevet i afsnit 7 i manualen under navnet regex.

4.6.2. Redirection

Det er ikke altid hensigtsmæssigt at få outputtet fra en kommando skrevet direkte på skærmen. Hvis du skriver ls /usr/bin, vil du forstå hvorfor. Derfor er det muligt at omdirigere output (eng. "redirect"). Til det formål bruger du tegnet > til at omdirigere outputtet til en fil.

[daisy@linus daisy]$  ls /usr/bin > usrbin.dir
[daisy@linus daisy]$  less usrbin.dir

Du kan også sende skreven tekst ind til et program som forventer tastetryk. Nedenstående lille program svarer "y" på et spørgsmål som "Interaktivkommando", beder brugeren at svare på.

#!/bin/sh
Interaktivkommando <<EOF
y
EOF

4.6.3. Pipes

Som du så i det foregående afsnit, kan du omdirigere outputtet til en fil. Nu kan du med rette spørge, hvorfor du skal omdirigere til en fil, hvis du kun skal se på den en gang? Svaret på dit spørgsmål er ligefremt: det behøver du heller ikke. Du kan nemlig sætte en pipe op. Ordet "pipe" betyder på engelsk ikke blot en pibe, man ryger tobak i, men også et rør, som kan bruges til at lede væske fra et sted til et andet. I Linux betyder det, at outputtet fra et program bruges som input til et andet. Lad os give et lille eksempel:

[daisy@linus daisy]$  ls /usr/bin | less

Den lodrette streg (|) sætter en "pipe" op. Outputtet fra ls /usr/bin bruges som input til less. Det er naturligvis muligt at sætte en række pipes op efter hinanden og på den måde slippe for en masse midlertidige filer.

4.6.4. Programmet grep

Ofte vil du fra kommandoer som cat, ls og find få alt for meget information, og oftest ved du godt, at det kun er en begrænset del af de viste linjer tekst, du er interesseret i. Hvis du f.eks. kun skal bruge de linjer af /etc/passwd, der indeholder navnet daisy, kan du bruge grep til at begrænse outputtet med.

[daisy@linus daisy]$  cat /etc/passwd | grep daisy 
daisy:x:501:501:Daisy,,,,:/home/daisy:/bin/bash