Linux – Friheden til at lære Unix: Version 1.8.20060212 – 2020-12-31 | ||
---|---|---|
forrige | Kapitel 4. Basal Unix | næste |
I dette appendiks vil vi gennemgå en række Unix/Linux-kommandoer. Gennemgangen er overfladisk, men du kan finde flere oplysninger i programmernes brugsanvisninger. Desuden er http://www.sslug.dk/artikler/begyndertips.html et godt sted at få mere information.
Linux (som Unix) arbejder med følgende input/output terminologi:
Standard input (stdin). Normalt tastaturet.
Standard output(stdout). Normalt skærmen.
Standard error (stderr). Normalt skærmen.
Vi har før været inde på, at stdout kan omdirigeres med >. cat fil1 fil2 > fil3 vil samle indholdet af filerne fil1 og fil2 i filen fil3.
Da måden, du omdirigerer på, er afhængig af valg af kommandofortolker, er det en god idé at undersøge dette nu. Prøv med:
[tyge@hven ~]$ env | grep ^SHELL | cut -d/ -f3
Svaret skulle gerne være bash, zsh, csh eller tcsh. Det kan være, at du anvender en anden skal – der findes mange. Hvis det er tilfældet, kan du se i brugsanvisningen for den aktuelle kommandofortolker (man SKALLENS_NAVN).
Hvis du selv starter en ny skal (enten fra kommandolinjen eller i et program), er det ikke sikkert, at ovenstående metode virker. Prøv derfor at skrive ps. En liste over de kørende processer vil da blive udskrevet til skærmen. Den nederste proces, der ender på "sh", angiver din skal – normalt.
Fælles for Bourne-Again Shell (bash) og C-Shell er følgende: Lad os antage, at filen fil3 indeholder information, vi ønsker at bevare. Vi vil tilføje (append) indholdet af fil1 og fil2 til fil3. Det gøres ved:
[tyge@hven ~]$ cat fil1 fil2 >> fil3
Indholdet af en fil kan også anvendes som argument(er) til en kommando. F.eks. vil følgende kommando sende indholdet af filen megenRos til SSLUG's webmastere:
[tyge@hven ~]$ sendmail www_admin@sslug.dk < megenRos
Linux skelner (som Unix) mellem normale uddata (stdout) og fejluddata (stderr). Til tider kan det være rart kun at omdirigere det ene sæt meddelelser.
Specielt for bash gælder følgende: Omdirigering af stdout (1) og stderr (2) i bash er forholdsvis simpel.
Hvis kun fejlmeddelelserne fra en kommando – her ls - ønskes:
[tyge@hven ~]$ ls 1> /dev/null
Hvis kun stdout ønskes vist og fejlmeddelelserne skal sendes til en fil:
[tyge@hven ~]$ ls 2> fejlfil
Og endelig, hvis du ønsker at akkumulere fejlmeddelelser i en fil, kan >> anvendes – f.eks.
[tyge@hven ~]$ ls 2>> fejlfil
De to skaller csh og tcsh adskiller sig fra bash på følgende måder. Når du omdirigerer med > eller >>, er det kun stdout, der omdirigeres. Hvis stderr skal med, skal du anvende & efter omdirigeringen. stderr kan ikke omdirigeres alene, men med lidt krumspring lykkedes det alligevel:
[tyge@hven ~]$ ls -l /* | tee >& fil1 | diff fil1 - >fejlFil
Ovenstående kommando sender både stderr og stdout til filen fil1.
Hvis du ønsker at vide, hvilke brugere der er logget på samme computer som dig, bruger du kommandoen who. Du vil så få en liste med brugere, der har logget ind, og fra hvilken (virtuel) terminal de er koblet til. Denne kommando har ikke den store værdi, med mindre du arbejder i et flerbruger-system. Arbejder du i et større netværk, kan det være, at rwho virker. rwho viser dig, hvem der er logget ind på hvilke computere i netværket. Dette kræver dog at både klient og server kører rwho-dæmonen.
[tyge@hven ~]$ who tyge tty1 Dec 21 17:25 tyge pts/0 Dec 21 17:26 tyge pts/1 Dec 21 17:26 tyge pts/2 Dec 21 17:26 katja pts/5 Dec 21 17:31 (k5.sslug)
Dette viser at brugeren tyge er logget ind via konsollen tty1, og har sidenhen (kl. 17:26) åbnet tre terminalvinduer – under X. Brugeren katja er også logget ind på maskinen kl. 17:31 fra maskinen "k5.sslug" og har kun et terminal-vindue (pts/5) åbent.
Man kan få mere information end blot antal terminaler ved at skrive
[tyge@hven ~]$ w 5:35pm up 7:20, 8 users, load average: 0.14, 0.15, 0.10 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tyge tty1 - 5:25pm 9:40 1.26s 0.03s /bin/sh /usr/X1 tyge pts/0 - 5:26pm 7:03 2.50s 2.50s /usr/bin/pine tyge pts/1 - 5:26pm 9:01 0.04s 0.04s /bin/cat tyge pts/2 - 5:26pm 3:48 0.40s 0.40s -bin/tcsh katja pts/5 k5.sslug 5:31pm 3:13 0.37s 0.37s -tcsh tyge pts/6 - 5:33pm 1.00s 0.25s 0.04s w
Man får igen samme information om de to brugere som er logget ind, men der er mere information her. Man kan også se hvor lang tid de enkelte terminalvinduer har været urørte under "IDLE" og under "WHAT" kan man se om der kører et program i den enkelte terminal. I terminalen pts/0 kører der eksempelvis pine – dvs. et e-post program.
En anden vej at udvide information er at skrive
[tyge@hven ~]$ who am i k6.sslug!tyge pts/6 Dec 21 17:33
Resultatet er at man får maskin-navnet "k6.sslug" på den maskine man sidder ved og dernæst kommer brugernavnet. Det er meget nyttigt hvis man f.eks. anvender DHCP eller logger meget ind fra en maskine til mange andre over netværket.
Det næste vi ser på er finger, som giver lidt ekstra informationer. Man skriver "finger BRUGERNAVN" for at se information om BRUGERNAVN. Man får information tilbage om brugeren er logget ind på maskinen og man kan også se brugerens rigtige navn under "Name:"-feltet.
[tyge@hven ~]$ finger katja Login: katja Name: Katja B Directory: /home/katja Shell: /bin/tcsh On since Fri Dec 21 17:31 (CET) on pts/5 from k5.sslug 11 minutes 9 seconds idle (messages off) No mail. No Plan.
Hvis man vil have en oversigt over alle der er logget ind på systemet kan det klares ved blot at køre finger uden nogle kommandolinjetilvalg.
Finger læser filerne; ~/.plan og ~/.project. Er man systemadministrator (root) kan last og lastlog også give seneste login information.
Nu har vi set et par forskellige måder til at få information om hvilke brugere som anvender maskinen. En nem måde at få kontakt til en anden bruger på maskinen er at anvende "talk" (dette kræver at talk-dæmonen er installeret og startet). Men "talk BRUGERNAVN" kan man få en ICQ-lignende chat-session i gang hvor skærmen deles i to. Er brugeren logget ind i flere terminaler kan man anføre et ekstra argument til kommandoen "talk BRUGERNAVN TERMINAL", hvor terminal en af de terminaler, som BRUGERNAVN anvender – ovenfor kan brugeren "katja" findes på pty/5.
find bruges til at finde filer med. Syntaksen er: find hvorfra hvad [handling]. Ikke alle Linux/Unix-varianter kræver 3. argument. Lad os se nærmere på argumenterne.
1. argument, hvorfra:
./ angiver aktuelt katalog.
~/ angiver hjemmekatalog.
/ angiver roden.
/usr angiver usr og alt under.
2. argument, hvad:
-name foomed navnet foo
-type dsom er et katalog.
3. argument, [handling]:
-lsudfører ls -l på søgeresultatet
-exec cmd {}\;udfører kommandoen cmd på søgeresultatet.
-oksom
execmen spørger først.
Som et sødt lille eksempel på hvor smart find er, så kan vi tælle det totale antal af linjer i en række HTML-tekstfiler, der ligger spredt i nogle underbiblioteker.
[tyge@hven ~]$ (find . -name "*.html" -exec cat {} \;) | wc -l
Kommandoen touch anvendes til at oprette tomme filer eller til at ændre tidspunktet for sidste modifikation.
Lad os antage, at filen minFil eksisterer, og filen minIkkeEksisterendeFil ikke gør, da vil touch minFil sætte tiden for sidste modifikation af filen til det aktuelle klokkeslet. Kommandoen touch minIkkeEksisterendeFil vil oprette en tom fil med navnet minIkkeEksisterendeFil.
Kommandoen file forsøger at gætte, hvilken filtype der er givet som argument. Hvis file tror, at det er en ascii-fil, vil file læse de 512 første tegn og forsøge at gætte programmeringssproget.
file gætter desværre forkert fra tid til anden og kan f.eks. ikke genkende filer, der indeholder programmer, som er skrevet i Pascal eller Lisp.
date udskriver den aktuelle dato og det aktuelle klokkeslet.
[tyge@hven ~]$ date lør jan 16 17:50:55 CET 1999
cal er en hel lille kalender. Uden argument udskrives kalenderen for den aktuelle måned. Med et argument (tal) regnes argumentet for et årstal. Vær i øvrigt opmærksom på, at cal er År 2000-klar, dvs. cal 99 udskriver kalenderen for år 99, mens cal 1999 skriver kalenderen for 1999.
Med 2 argumenter regnes det første som måned og det andet som årstal. Det er værd at bemærke, at cal antager, at skiftet fra den julianske kalender til den gregorianske kalender skete i september 1752, hvilket passer til engelske forhold (i katolske lande skete det i 1582 og i Danmark i år 1700).
[tyge@hven ~]$ cal 12 1991 December 1991 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [tyge@hven ~]$ cal 9 1752 September 1752 Su Mo Tu We Th Fr Sa 1 2 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
sort sorterer en fil linje for linje. sort kan også flette flere filer samtidig med at indholdet sorteres. Omdirigering af sort til en fil er mulig med tilvalget "-o". sort fil1 fil2 > fil1 vil give et pudsigt resultat: Da stdout omdirigeres til fil1, som eksisterer i forvejen, slettes fil1, og en ny, tom fil1 oprettes. Når fil1 og fil2 flettes og sorteres, vil fil1 være tom. Derfor vil kun indholdet af fil2 komme med i fil1 - kryptisk – prøv selv! Husk blot, at sort er den eneste (standard) kommando, hvor stdout omdirigeres med tilvalget "-o".
Men sort kan mere: En fil kan være inddelt i poster, f.eks. filen navne.
[tyge@hven ~]$ cat navne poul nyrup 52 holger beck-nielsen 90 william gates 55 torvalds linus ??
Lad os illustrere sort ved en række eksempler. sort +1 navne vil sortere på efternavn (første felt er felt 0). sort +2-n navne vil sortere numerisk på hattestørrelse. sort -r navne vil sortere i omvendt rækkefølge.
[tyge@hven ~]$ sort +2 -n -r navne torvalds linus 91.2 holger beck-nielsen 90 william gates 55 poul nyrup 52
diff udskriver forskellen mellem to filer. Lad os se på filerne fil1 og fil2.
[tyge@hven ~]$ cat fil1 Per Poul Bent [tyge@hven ~]$ cat fil2 Per Bjarne [tyge@hven ~]$ diff fil1 fil2 2,3c2 < Poul (oversat: ud går Poul) < Bent (oversat: ud går Bent) > Bjarne (oversat: ind kom Bjarne)
Eksempel 4-3. diff mellem hele katalog-strukturer
Kommandoen diff er faktisk ret smart. Man kan endda få den til at finde alle rettelser lavet mellem to kataloger, hvor der laves rekursiv søgning. Har man f.eks. katalogerne tux-ny og tux og skal vide hvad der er lavet om fra tux til tux-ny, så skriver man
[tyge@hven ~]$ diff -ur --new-file tux tux-ny diff -ur --new-file tux/README tux-ny/README --- tux/README Sun Jan 6 00:24:23 2002 +++ tux-ny/README Sun Jan 6 00:22:13 2002 @@ -1,5 +1,3 @@ -Dette katalog indeholder tekster svarende til -bogen, hvis vi har ment dette er relevant. Seneste bøger kan findes på www.linuxbog.dk
Parameteren u giver en pænere diff-fil med en rimelig syntaks (unified diff). Parameteren r betyder rekursiv søgning ned i katalog-strukturen og endelig så er --new-file med for at sørge for at nye filer også kommer med.
Vi fortsætter ud fra Eksempel 4-3. Hvad der nu er smart er at en anden bruger, tyge, der har den gamle katalog-struktur tux, og denne skal opgraderes med ændringerne fra brugeren tyge. Først gemmer tyge ændringerne i en fil, lap og sender denne til tyge:
[tyge@hven ~]$ diff -ur --new-file tux tux-ny > lap
Brugeren tyge kan derefter tage filen og køre patch for at få opdateret underkataloget tux:
[tyge@hven ~]$ patch -p0 -u < lap patching file tux/README
Nye filer skabes og slettede filer forsvinder automatisk. Det er på denne måde rettelser og tilføjelser (lapper) til Linux-kernen distribueres.
uniq fjerner ens linjer, der kommer efter hinanden, hvilket illustreres nedenfor.
[tyge@hven ~]$ cat per3 Per Per Per [tyge@hven ~]$ uniq per3 Per
cmp sammenligner filer og stopper læsningen af filerne, når cmp finder en forskel.
wc står for Word Count, og som navnet antyder, tæller den ord i en fil. wc har nogle tilvalg: "-l", "-w" og "-c" for Lines, Words og Characters.
Vil du vide, hvor mange linjer en fil indeholder, skriver du wc -l fil. wc er særlig god sammen med andre kommandoer og | (kanaler), f.eks. vil nedenstående kommando tælle op, hvor mange filer, der er i kataloget /usr/bin
[tyge@hven ~]$ ls /usr/bin | wc -l 1208
Eller hvis du vil vide, hvor mange kataloger der er i /etc:
[tyge@hven ~]$ find /etc -type d -maxdepth 1 | wc -l 23Forklaringen er som følger: find /etc finder alle filer og kataloger under /etc. Tilvalget -type d gør at kun kataloger bliver vist. Og tilvalget -maxdepth 1 gør at søgningen bliver begrænset til /etc (ellers ville /etcs underkataloger og underkatalogers underkataloger også blive gennegået). Uddata fra find kommer som standard med et filnavn per linje. wc -l tæller antallet af linjer den modtager.
tail – uden tilvalg – udskriver de 10 sidste linjer af en fil, "-5" vil udskrive de 5 sidste linjer, og "+8" vil udskrive fra og med linje 8 i en fil. Lad os se på et eksempel.
[tyge@hven ~]$ cat sang Jeg bærer med smil min byrde, jeg drager med sang mit læs; jeg er som den vilde hyrde, der genner sit kvæg på græs. [tyge@hven ~]$ tail -2 sang jeg er som den vilde hyrde, der genner sit kvæg på græs.
tail har et meget nyttig "f"-tilvalg. Den får tail til løbende at vise de sidste 10 linjer af en fil, f.eks. vil du med tail -f /var/log/messages kunne følge med i, hvad alle system-dæmoner og lignende rapporterer.
head svarer til tail, men i stedet for slutningen af en fil, er det begyndelsen. head – uden tilvalg – udskriver de 10 første linjer af en fil. Tilvalg kan gives som for tail.
cut tager det, du specificerer i tilvalg, ud af en linje, dvs. -cx-y: tager fra tegn nr. x til tegn nr. y på hver linje i den specificerede fil. Er der kun ét tal, tages kun dette tegn ud. -fx-y er som for c, men her drejer det sig om felter, og -d'X' angiver felt-separatoren.
Vil du se, hvilke brugere der har adgang til systemet, så prøv: cat /etc/passwd | cut -d':' -f1
paste samler filer lodret, hvor cat samler (kan samle) filer vandret. Lad os se på følgende eksempel. Du ønsker nu at samle to filer, navne og iq, således at linje 1 fra navne efterfølges af linje 1 fra iq (uden at dette dog skulle være konkluderende, for såvidt angår de tilfældige sammenstillinger af for- og efternavne samt tal).
[tyge@hven ~]$ cat navne poul nyrup 52 holger beck-nielsen 90 william gates 55 torvald linus ?? [tyge@hven ~]$ cat iq 50 230 120 ?? [tyge@hven ~]$ paste navne iq poul nyrup 52 50 holger beck-nielsen 90 230 william gates 55 120 torvald linus ?? ??
tr erstatter det første argument med det andet. tr er en lidt speciel sag. Den forventer, at få input fra stdin. Derfor må du bruge følgende fremgangsmåde, hvis du vil erstatte noget i fil1, og skrive indholdet til fil2. Hvis du ønsker, at alle små tegn skal erstattes med store, skulle følgende kunne lade sig gøre:
[tyge@hven ~]$ tr '[a-z,æ,ø,å]' '[A-Z,Æ,Ø,Å]' < fil1 > fil2
En af de meget nyttige kommandoer er xargs, som kan bruges som kobling mellem en kommando der giver en række filnavne, hvor der skal udføres en speciel kommando på hver af de filer. Som eksempel kan vi prøve at få antal linier i alle filer der ender på .sgml.
[tyge@hven ~]$ ls *.sgml indhold.sgml mandrake.sgml unix.sgml
Hvis man prøver at kanalisere filnavnet ind i wc, så går det galt
[tyge@hven ~]$ ls *.sgml | wc --lines 3
Det der kommer som svar er at der er tre filer i ls-kommandoen. I stedet bruger vi xargs
[tyge@hven ~]$ ls *.sgml | xargs -i= wc --lines = 700 indhold.sgml 232 mandrake.sgml 1232 unix.sgml
Programmet xargs får her filnavnene ind, og kører en kommando for hver af strengene. Argumentet -i= betyder at i den efterfølgende kommandoer skal lig-med (=) erstattes med en af de tekst-strenge (her er det et filnavn). Kommandoen er her wc --lines =, som viser antal linier i filnavnet =, dvs. det som kommer fra ls-kommandoen.
Der der i det nuværende katalog er tre filer, så er det nemt at vise hvad der egentlig bliver udført at ovenstående xargs-kommando:
wc --lines indhold.sgml wc --lines mandrake.sgml wc --lines unix.sgml
Det skal nævnes at anvendelsen af lig-med i eksemplet ikke er essentiel. Man kan også anvende et andet special-tegn.
Tabel 4-6. Oversigt over de mest anvendte andre Unix-kommandoer.
Kommando | Forklaring |
---|---|
find | Find fil(er). Anvend f.eks. find /usr -name "*.gif" til at finde alle filer under biblioteket /usr, der ender på .gif. Prøv også locate FILNAVN. |
whoami | Viser hvilket brugernavn-navn der arbejdes under. |
who | Viser hvem der er logget ind på maskinen. |
passwd | Skift adgangskode. |
su | Skift bruger-identitet. |
echo | Kommandoen echo "TEKST" skriver teksten på skærmen. |
chown | Ændrer ejerskabet af filer. |
date | Viser dato og tid. |
lpr | Print ordre. Anvend lpr -Pprinternavn filnavn for at printe på printeren printernavn. De enkelte printere er defineret i filen /etc/printcap. De aktuelle printere kan være såvel lokale som netprintere. |
lpq | Printerkø forespørgsel. Anvend lpq -Plp til at vise, hvor langt printeren lp er med at printe ud. |
lprm | Anvendes til at fjerne printjobs, som ikke er skrevet endnu. Se muligheder med man lprm. |
tar | Anvendes til at pakke flere filer sammen til en. Anvend f.eks. tar cvf tfil.tar fil1 fil2 for at pakke fil1 og fil2 sammen til filen tfil.tar. Tilsvarende kan filen pakkes ud med tar xvf tfil.tar. |
compress | Pakker filer ind/ud. Anvend compress filnavn til at pakke filen til filnavn.Z. Tilsvarende anvendes uncompress til at pakke ud. |
gzip | Andet og bedre pakkeprogram, der anvender .gz som slutning af filnavn. Tilsvarende findes gunzip til at pakke ud. Normalt ses også filtypen .tgz, som er en tar fil, hvor der efterfølgende er anvendt gzip. |
bzip2 | Andet og bedre pakkeprogram, der anvender .bz2 som slutning af filnavn. Tilsvarende findes bunzip2 til at pakke ud. Normalt ses også filtypen .tar.bz2, som er en tar fil, hvor der efterfølgende er anvendt bzip2. |
diff | Sammenligner to filer og rapporterer forskellene. |
free | Viser, hvor meget hukommelse der er brugt, og hvor meget der er til rådighed. |
df | Viser, hvor meget diskplads der er brugt, og hvor meget der er til rådighed på samtlige diske. |
du | Viser status over, hvor meget diskplads der er brugt under det sted, hvor du står i filtræet. |
sort | Sorterer linjerne i en tekstfil. |
ssh | ssh saltholm.sslug.dk date betyder, at du udfører kommandoen date på maskinen saltholm.sslug.dk, dvs. en anden Unix-maskine. Linux kan udføre kommandoer på andre maskiner og så vise grafik (og tekst) på din egen maskine. |
telnet | Opretter en ukrypteret netværksforbindelse til en anden maskine. Nyttig til afprøvning og fejlsøgning af netværksforbindelser. |
ping | Undersøger om der er forbindelse til en anden maskine. Nyttig til afprøvning og fejlsøgning af netværksforbindelser. |
traceroute | Viser hvilke maskiner forbindelsen til en anden maskine går over. Nyttig til afprøvning og fejlsøgning af netværksforbindelser. |