Linux:Kommandolinja

Tilbake til Linux


Bash, tradisjoner. Praktisk bruk. Piping. Unix-filosofi (små, enkle komponenter). Filsystem/hiarki.
Rett og slett en grunnleggende opplæring av hvordan en kommandolinje fungerer (første "ord" er
programmet, deretter følger argumentene etc). Dobbelttabbing. "man man" - eller hører den hjemme i
"hvordan finne informasjon? bruker:kyrsjo

Kommandolinja er det feltet UNIX og UNIX-liknende operativsystemer skiller seg mest fra andre - de kan vise til en imponerende kraftig kommandotolk. Dette er et program som (enkelt forklart) tar i mot kommandoer brukeren skriver inn og tolker dem. Utseendemessig er den ikke helt ulik DOS, men der slutter også de fleste likhetene - UNIX-kommandotolken er et imponerende kraftig verktøy, og sannsynligvis opphavet til ryktet om at UNIX-administratorer er late...

Nok prat. Åpne et kommandovindu (ofte kalt et "shell" eller en "terminal") og hiv deg inn i det. Du får opp ett vindu som ser ca. slik ut:


Du ser at det står "[brukernavn@pcnavn ~]$" etterfulgt av en blinkende markør - nøyaktig hva som står her kan variere, men legg merke til dollartegnet. Dette er et "klartegn" - noe som betyr at maskinen er klar til å motta en kommando - en kortere eller lengre "settning" avsluttet med linjeskift (enter). En slik settning kalles en kommando. Hvis dollartegnet er erstattet med et siffertegn ("#") betyr det at du er logget inn som adminstrator ("root") i terminalen (kommandolinjen).

Vi skal nå gå igjennom de vanligste og viktigste kommandoene. Den viktiste kommandoen av dem alle er uten tvil "ls" - list directory contents. Denne vil vise deg innholdet i den mappen du akkurat nå står i (på samme måte som "dir" i DOS, for de som er kjent med dette).

Fil:Terminal-ls.png

Men hvor i katalogstrukturen er vi hen? Trikset her heter "pwd" - Print Working Directory.

[kyrre@testpc ~]$ pwd
/home/kyrre

Vi ser at vi står i mappa /home/kyrre - "hjemmemappen" til brukeren kyrre. Når du logger inn på en UNIX-maskin vil du alltid starte i hjemmemappen din. Alle innstillingene og filene mine er lagret i denne mappen.

Legg merke til at UNIX bruker tegnet "/" for å skille mellom forskjellige mapper.

Vi får også nok et hint om at dette vha krøllstreken ~ foran klartegnet - denne krøllstreken er en forkortelse av navnet til brukermappen. Vi skal høre mer om dette senere.

En annen svært viktig kommando er "cd" - change directory. Som navnet anntyder benytter vi denne til å bytte hvilken katalog vi jobber i. Denne bruker vi slik:

cd katalog-vi-øsnker-å-bytte-til

Dersom vi f.eks. ønsker å bytte til underkatalogen linuxbok, skriver vi:

[kyrre@testpc ~]$ cd linuxbok/
[kyrre@testpc linuxbok]$

Legg merke til at det nå står "linuxbok" foran klartegnet - vi har altså byttet katalog. Vi kan se hvilken katalog vi nå er i:

[kyrre@testpc linuxbok]$ pwd
/home/kyrre/linuxbok

og hva som er i denne katalogen:

[kyrre@testpc linuxbok]$ ls
slettmeg  terminal-ls.png  terminal.png

Vi ser her at vi har tre filer - hvor den ene heter "slettmeg". La oss gjøre akkurat det - kommandoen for dette er "rm" - remove, og brukes slik:

rm filnavn

eksempel:

[kyrre@testpc linuxbok]$ ls
slettmeg  terminal-ls.png  terminal.png
[kyrre@testpc linuxbok]$ rm slettmeg
[kyrre@testpc linuxbok]$ ls
terminal-ls.png  terminal.png

Vi ser at fila ble borte.

Kataloger er en fin ting å ha - og disse kan vi også lage fra kommandolinja. Her heter det "mkdir" - make directory:

[kyrre@testpc linuxbok]$ mkdir katalog
[kyrre@testpc linuxbok]$ ls
katalog  terminal-ls.png  terminal.png

Vi ser at vi har fått opprettet en ny katalog "katalog". La oss nå prøve å slette denne:

[kyrre@testpc linuxbok]$ rm katalog
rm: cannot remove «katalog»: Er en filkatalog

Det gikk dårlig. Vi prøver med et lite triks "rm -rf filnavn":

[kyrre@testpc linuxbok]$ rm -rf katalog/
[kyrre@testpc linuxbok]$

Dette gikk bedre!

Men hva gjorde vi nå? Hva betyr "rm -rf filnavn"? Eller for den saks skyld - "rm filnavn" eller "mkdir nykatalog"? For å vite dette, må vi kunne litt grunnleggende unix-gramatikk.

"rm" er ikke bare en kommando, det er også ett program. På samme måte som at du starter programmet "rm" ved å skrive "rm" i kommandolinja og trykke enter, kan du f.eks. starte firefox ved å skrive "firefox" i kommandolinja og trykke enter.

Nå er det bare slik at "rm" alene ikke gir noen særlig mening. Hva er det som skal slettes? La oss prøve:

[kyrre@testpc linuxbok]$ rm
rm: for få argumenter
Prøv med «rm --help» for mer informasjon.
[kyrre@testpc linuxbok]$

Som vi ser, skjønner ikke stakars rm stort. For å fortelle den dette, sender vi "rm" argumentet "filnavn". Sagt på en annen måte - vi kjører "rm" med argumentet "filnavn". rm ser dette, og handler ut i fra det - den sletter det som den er blitt bedt om å slette i argumentet "filnavn".

Andre argumenter har en eller to bindestreker ("-") foran seg - disse kalles brytere. Brytere gjør akkurat det du tror de gjør - slår av eller på funksjoner til programmet de hører til. Noen brytere har lange navn, og da skrives de som regel med to streker:

[kyrre@testpc linuxbok]$ rm --help
Usage: rm [OPTION]... FILE...
Remove (unlink) the FILE(s).

  -d, --directory       unlink FILE, even if it is a non-empty directory
                          (super-user only; this works only if your system
                           supports `unlink' for nonempty directories)
  -f, --force           ignore nonexistent files, never prompt
  -i, --interactive     prompt before any removal
      --no-preserve-root do not treat `/' specially (the default)
      --preserve-root   fail to operate recursively on `/'
  -r, -R, --recursive   remove the contents of directories recursively
  -v, --verbose         explain what is being done
      --help     vis denne hjelpteksten og avslutt
      --version  vis programversjon og avslutt

To remove a file whose name starts with a `-', for example `-foo',
use one of these commands:
  rm -- -foo

  rm ./-foo

Note that if you use rm to remove a file, it is usually possible to recover
the contents of that file.  If you want more assurance that the contents are
truly unrecoverable, consider using shred.

Report bugs to <bug-coreutils@gnu.org>.
[kyrre@testpc linuxbok]$

Et annet eksempel enn "--help" (som kan brukes på de aller, aller fleste programmer) er --force og --recursive. Men det er jo kjedelig å skrive "rm --force --recursive katalog" hver gang vi skal slette en katalog - så disse flaggene (et annet, mer generellt navn på en bryter) kan trekkes sammen til "-f" og "-f" - eller settes bak en enkelt strek, slik som vi så i stad ("rm -rf filnavn").

La oss nå utforske options'ene til "ls". De vanligste her er:

  • -l: Liste med mer informasjon
  • -a: Vis alle filer (også skjulte)
  • -R: Rekursivt (vis innhold i undermapper)

La oss prøve. Vi står igjen i katalogen "linuxbok", og kjører "ls" på vanlig måte:

[kyrre@testpc linuxbok]$ ls
enmappe  terminal-ls.png  terminal.png

Vi ser at mappen inneholder tre filer - hvorav en er en mappe (enmappe). Hva hvis vi prøver oss med noen "options"?

[kyrre@testpc linuxbok]$ ls -a
.  ..  enmappe  .skjult-og-hemmelig-fil  terminal-ls.png  terminal.png

Her kom det fram tre nye filer:

  • ".": Denne refererer til mappen vi står i. Derfor vil f.eks. "cd ." resultere i at vi skifter til den mappen vi akkurat nå står i.
  • "..": Mappen den mappen vi står i er undermappe i. F.eks. vil ".." sett fra inne i mappen "/home/kyrre/linuxbok/enmappe" være "/home/kyre/linuxbok/.". Dermed vil kommandoen "cd .." bety "gå en mappe opp" - og kjørt fra ~/linuxbok/enmappe vil man ende i "~/linuxbok".
  • ".skjult-og-hemmelig-fil": Akkurat det navnet anntyder - en skjult fil. I UNIX er filer som begynner med "." skulte. Dersom du ser i hjemmemappen din, vil du se en hel haug av slike skjulte filer - hos meg ser det slik ut:
[kyrre@testpc ~]$ ls -a
.                        .evolution                   .kde                     retro.psd            snitt.xls
..                       .gaim                        kjemibilder              .rhn-applet          .ssh
.anjuta                  .gconf                       linuxbok                 .rhn-applet.cache    stoffer i kretsløp.odt
.bash_history            .gconfd                      linuxprosjekt stikkord   .rhn-applet.conf     .themes
.bash_logout             .gimp-2.2                    .local                   Skjermdump2.png      .thumbnails
.bash_profile            .glade2                      .mcop                    Skjermdump3.png      .Trash
.bashrc                  .gnome                       .metacity                Skjermdump4.png      .uqm
.bittorrent              .gnome2                      .mozilla                 Skjermdump-oo10.png   VenusColony_STAIF03.pdf
.bkchem                  .gnome2_private              .mplayer                 Skjermdump-oo1.png   .viminfo
.cache                   .gnome-system-monitor.kyrre  .nautilus                Skjermdump-oo2.png   workspace
.cddbslave               gnome-vfs                    Ny database.odb          Skjermdump-oo3.png   .Xauthority
.config                  .gstreamer-0.8               .openoffice.org2.0       skjermdump-oo4.png   .xchat2
Deer Park_wallpaper.png  .gtkrc                       oppgaver ons 11 mai.odt  Skjermdump-oo5.png   .xmms
Desktop                  .gtkrc-1.2-gnome2            programmering            Skjermdump-oo6.png   .xscreensaver
.dmrc                    .hxplayerrc                  Projects                 Skjermdump-oo7.png
.eclipse                 .ICEauthority                .qt                      Skjermdump-oo8.png
.eggcups                 .inkscape                    .recently-used           Skjermdump-oo9.png
.esd_auth                java-1.4.2-gcj-compat        retro.jpg                Skjermdump.png

Vi ser at vi har en hel haug med filer med navn á la ".programmnavn". Dette er konfigurasjonsfiler for et program - f.eks. er ".gaim" en mappe som inneholder filene til direktemeldingsprogrammet gaim.

"ls -R" er også svært nyttig - den viser innholdet i en hel trestruktur. La oss prøve i "linuxbok"-mappa:

[kyrre@testpc linuxbok]$ ls -R
.:
enmappe  terminal-ls.png  terminal.png

./enmappe:
annen-fil-i-mappe  fil-i-mappe

Vi ser at mappen vi står i (".") inneholder tre filer - "enmappe", "terminal-ls.png", "terminal.png". En av disse filene er en mappe ("enmappe"), og inneholder selv filene "fil-i-mappe" og "annen-fil-i-mappe".

Legg spesielt merke til at det står "./enmappe" - vi husker at "." var den mappen vi sto i (i dette tilfellet "~/linuxbok/", og at UNIX brukte tegnet "/" til å skille mellom mapper. Dermed betyr "./enmappe" "fil-i-denne-mappen som heter enmappe".

Det siste flagget "-l", er ekstremt nyttig. Vi får da opp mye mer informasjon om filene:

[kyrre@testpc linuxbok]$ ls -l
totalt 976
drwxrwxr-x  2 kyrre kyrre   4096 aug 27 12:49 enmappe
-rw-rw-r--  1 kyrre kyrre 458215 aug 23 16:43 terminal-ls.png
-rw-rw-r--  1 kyrre kyrre 526642 aug 23 16:12 terminal.png

Den første linja indikerer plassen filene i denne mappen tar (i kilobyte). (????) De neste linjene (en linje for hver fil) er noe mer interessante. La oss se på linje nr. 3:

-rw-rw-r--  1 kyrre kyrre 458215 aug 23 16:43 terminal-ls.png

Vi ser at den er delt inn i en rekke felter. Det føste feltet:

-rw-rw-r--

spesifiserer tilgangen til denne filen. Den er egentlig kun interessant lest sammen med felt #3 (fileier) og felt #4 (fileiergruppe). For å forstå dette må man altså kunne litt om brukere, grupper og rettigheter på et UNIX-system.

Alle filer er eid av en bruker og en brukergruppe. Som du kansje vet, er UNIX et såkalt "ekte flerbrukeroperativsystem" - det vil si at at flere brukere kan bruke maskinen samtidig, uten å forstyrre hverandre (forhåpentligvis ikke over samme tastatur, men via "fjerntilkoplinger" - det være seg Internett, flere tastatur/skjermer koplet til samme maskin, seriellport-konsoller etc.). For å få til dette må man ha et system for hvem som har hvilke rettigheter til hvilke filer, slik at Per ikke (med vilje eller ikke) overskriver Påls filer, og at Pål ikke kan lese Pers hemmelige kjærlighetsbrev.

Så når jeg med min bruker (som heter kyrre) oppretter en ny fil på disken, blir den automatisk eid av brukeren "kyrre", og av gruppen "kyrre" ettersom det er min "standardgruppe". På noen systemer er alle brukerene meldt inn i en stor gruppe som heter "users" - filen ville da blitt eid av "kyrre.users". Det å bruke punktum for å skille mellom bruker og brukergruppe er en vanlig notasjon. En bruker kan godt være medlem i mer enn en gruppe - men kun ha en standardgruppe.

Vi kan nå begynne å titte litt mer på det første feltet. Vi legger merke til at det er delt inn i 1+3 felt - først et lite, en-bokstavs "forfelt" som blant annet brukes til å fortelle om det er en katalog eller en vanlig fil (pluss et par ting til - "sticky" og "suid" er stikkord du kan google selv.). Deretter følger tre felt på tre bokstaver - "r", "w", og "x". Dette er flagg som kan slås av og på - "-" betyr avskrudd, og en bokstav betyr påskrudd.

Det første trebokstavers-feltet er for filens eier, det andre for filens eiergruppe, og det tredje for alle andre. Merk at kun filens eier, og ingen andre (unntak: en spesiell bruker som heter "root" og brukes til administrasjons-oppgaver - men dette snakker vi mer om senere) kan sette rettigheter for en fil.

  • Den første bokstaven i disse feltene, "r", betyr "read" (les). Dersom denne er slått på, vil de brukerene tripletten gjelder for ha mulighet til å lese innholdet i filen.
  • Den andre bokstaven i disse feltene, "w", betyr "write" (skriv). Dersom denne er slått på, vil de brukerene tripletten gjelder for ha mulighet til å skrive til filen.
  • Den tredje bokstaven i disse feltene, "x", betyr "execute" (kjør). Dersom denne er slått på, vil de brukerene tripletten gjelder for ha muligheten til å kjøre filen dersom det er et program, og gå inn i mappen dersom det er en mappe.

Disse gir langt mer mening for et system med mange brukere (f.eks. en webserver eller en stormaskin på en bedrift eller et universitet).