1.3. Kommandofortolkerne

En kommandofortolker er et program som brugeren kan bruge til at kommunikere med styresystemet. Den vil typisk kunne bruges til at starte andre programmer, til at styre hvordan data skal kanaliseres fra program til program og til at undersøge systemets tilstand.

Man kan se hvilke godkendte kommandofortolkere som findes på systemet i filen /etc/shells. Hvis man efterinstallerer en kommandofortolker på systemet, er det vigtigt at man husker at føje den fulde sti til den nye kommandofortolker til /etc/shells, da de brugere der vil bruge den kommandofortolker ellers kan få problemer.

På en SuSE-maskine kan /etc/shells se ud som følger – om de alle rent faktisk er installerede er ikke garanteret. Oftest følger alle med Linux-distributionerne.

[tyge@hven ~]$ cat /etc/shells
/bin/ash
/bin/bash
/bin/bash1
/bin/csh
/bin/false
/bin/ksh
/bin/sh
/bin/tcsh
/bin/true
/usr/bin/csh
/usr/bin/ksh
/usr/bin/passwd
/usr/bin/bash
/usr/bin/rbash
/usr/bin/tcsh
/usr/bin/zsh

I det følgende går vi nærmere ind i flere af de kommandofortolkere man typisk anvender. De mest anvendte kommandofortolkere er bash og tcsh (i den rækkefølge), mens det er sjældnere at folk bruger de ældre kommandofortolkere csh og ksh, eller den forholdsvis nye zsh.

Man kan afprøve en kommandofortolker ved simpelt hen at starte den som ethvert andet program:

[tyge@hven ~]$ zsh
hven% 
Man kan (i princippet) altid stoppe en kommandofortolker med tastetrykket Ctrl-D, der signalerer at der ikke er flere data til programmet:
hven% <Ctrl-D>
[tyge@hven ~]$ 
Bemærk at de forskellige kommandofortolkeres kommandolinjer almindeligvis ser forskellige ud, så det er enkelt at se lige netop hvilken kommandofortolker man bruger. Men man kan selv justere kommandolinjens udseende, så den giver de oplysninger man har brug for.

Man vælger sin standard-kommandofortolker med programmet chsh (kort for "change shell"):

[tyge@hven ~]$ chsh -s /bin/zsh
Changing login shell for tyge.
Password: din adgangskode skrives her
Shell changed.
(det kan godt ske at teksten er på dansk). Ændringen træder i kraft næste gang du logger ind på maskinen.

1.3.1. GNU Bourne Again Shell (bash)

Bash er den klart mest populære kommandofortolker i linux-verdenen. Det er ikke en tilfældighed, da den er forvalgt som kommandofortolker for nye brugere på de fleste linux-systemer, og da den er ret tæt på at have den syntaks som Unix-standarden specificerer for kommandofortolkere.

Ved login læses filen ~/.bash_profile (eller ~/bash_login eller ~/.profile), og hver gang et terminalvindue startes vil filen ~/.bashrc blive læst og udført. Endelig er det muligt at få filen ~/.bash_logout udført når man stopper en kommandofortolker – her er det muligt at indlægge kommandoer som rydder op etc.

Bash udmærker sig dels ved at være kompatibel med den gamle unix-kommandofortolker, sh, men i høj grad på dens rigdom på både programmeringmuligheder og til en vis grad også på dens funktioner som interaktiv kommandofortolker.

Med pil-op/ned kan med genfinde de forrige kommandoer og man kan endda søge sig tilbage til en kommando man engang har udført i Bash ved at trykke Ctrl-r STARTEN-AF-DEN-GAMLE-KOMMANDO. Med yderligere tryk på Ctrl-r vil man gense andre ældre kommandoer der også passer med starten af den kommando man har skrevet.

Med tabulator-tasten kan man få ekspanderet fil/katalog-navne svarende til den begyndelse af navnet man skriver. Man kan således med cat /e<tabulator>/sh<tabulator> få ekspanderet sig til cat /etc/shells uden at få skrevet ret meget.

Aliaser er nemme at sætte op i Bash. Opret filen ~/.alias og indskriv aliaser efter skemaet alias ALIAS-navn="kommando". Hvis man senere vil se hvilke aliaser man anvender kan alias vise dem alle.

alias ll="ls -al"
alias sa="ssh-add ~/.ssh/id_dsa"

Kommandoprompten kan sættes nøjagtig efter egen smag efter et stort udbud af muligheder. I denne bog har vi valgt at få vist brugernavn (\u), maskinnavn (\h) og nuværende katalog (\w), men man kan nemt vælge om som vist nedenfor. Udseende af prompten ændres direkte ved at sætte variablen PS1. Her ændrer vi til at vise brugernavn (\u) og tidspunktet (\T).

[tyge@hven ~]$ echo $PS1
[\u@\h:\w] 
[tyge@hven ~]$ export PS1="\u (\T):"
tyge 10:01:12 :

Tip: Vil du have farver på din promt, så læs http://www-106.ibm.com/developerworks/linux/library/l-tip-prompt/.

1.3.1.1. Fiduser til mere effektiv brug af Bash

Du skal også lege lidt med tasterne pil-op og pil-ned, som løber igennem de gamle kommandoer igen. Ctrl-A og Ctrl-E bruges til at gå til starten og slutningen af en linje.

Kommando- og filudvidelsesfunktionerne er utroligt rare, hvis man vil slippe for at skrive lange program- og filnavne igen og igen. Når man har skrevet starten på et program- eller filnavn kan man ved at trykke på tabulatortasten få kommandofortolkeren til at gætte hvad man mener. Hvis der kun er én mulighed fylder kommandofortolkeren resten af navnet på. Er der flere muligheder, kan du trykke endnu en gang på tabulatortasten for at få vist alle mulighederne.

Hvis du skriver

[tyge@hven ~]$ tou<TAB> sikke_et_langt_filnavn
skulle det gerne blive til
[tyge@hven ~]$ touch sikke_et_langt_filnavn
idet der ikke er andre kommandoer, der begynder med 'tou'
[tyge@hven ~]$ rm sik<TAB>

Det fungerer i øvrigt ved, at kommandofortolkeren i første "ord" leder efter en kommando eller et program den kender gennem systemvariablen PATH eller i den sti, som angives foran selve kommandoen. Efter kommandoen ledes der efter filnavne i det angivne bibliotek.

1.3.2. Csh

En af de gamle kommandofortolkere som i praksis findes på alle unix-systemer er csh – "the Berkeley UNIX C shell". Tcsh skal ses som en naturlig videreudvikling af Csh, og er i praksis bagudkompatibel med Csh. Til alle praktiske formål er Tcsh at foretrække fremfor Csh, hvorfor vi ikke skal beskæftige os videre med Csh.

1.3.3. Tcsh

Tcsh er en af de meget populære kommandofortolkere i unix-verdenen, da den giver stort set alle de samme muligheder som bash (omend med en anden syntaks), er bagudkompatibel med den aldrende csh-kommandofortolker, og har en lidt mere raffineret kommando- og filnavnsekspansionsfunktion, som man som bruger selv kan indstille så det kun er de relevante filer der bliver foreslået. Et eksempel:

[tyge@hven ~]$ ls
linuxbog-unix.ps
linuxbog-unix-html.tar.gz
[tyge@hven ~]$ gv l<tab>
bliver til
linuxbog-unix.ps
[tyge@hven ~]$ gv linuxbog-unix.ps
hvis brugeren (eller systemadministratoren) har indstillet tcsh så den går ud fra at programmet gv kun bruger filer der ender på ".ps". Lige netop denne indstilling laves med linjen:
complete gv       'p/*/f:*.{ps,pdf,eps}/'
(filnavne der ender på ".pdf" og ".eps" kan også bruges). Som bruger føjer man den til filen "~/.tcshrc", mens man som systemadministrator kan føje den til "/etc/csh.cshrc", hvorved alle der bruger Tcsh vil få fornøjelse af det.

Selvom der er masser af andre filer, så vil tcsh filtrere filerne intelligent, da den ved at første argument efter gv kun kan være en Postscript-fil – evt. i et af underkatalogerne. Tcsh kan sættes op til at genkende alle programmers filtyper. I bogens eksempler på www.linuxbog.dk/unix/eksempler/shells/tcsh kan findes dot.complete.tcsh, som viser hvordan mange programmer er tilpasset.

I eksemplet er vist hvordan man ikke behøver at skrive hele filnavnet. Skulle der være flere filer som passer med starten af det man skriver, vil alle muligheder blive vist og man må fylde lidt flere bogstaver på før kommandofortolkeren automatisk kan gætte resten. Tricket med at trykke tabulator kan anvendes hele tiden.

Skulle man få brug for at udføre en af de forrige kommandoer igen, da trykker man blot på pil op (eller ned) for at gå igennem de forrige mange kommandoer. Det er i praksis en funktion man anvender meget. Hvis man skal til starten eller slutningen på den kommando man er ved at skrive bruger man henholdsvis Ctrl-A og Ctrl-E.

Hvis man vil lave genveje til kommandoer med aliaser kan man sætte dem ind i filen "~/.tcshrc", der bliver læst når Tcsh starter. Skemaet er alias navn "kommando". Hvis man senere vil se hvilke aliaser man har defineret bruger man kommandoen alias.

Hvis tcsh startes som login-kommandofortolker vil den (udover nogle systemopsætningsfiler) læse filerne "~/.tcshrc", "~/.history", "~/.login" og "~/.cshdirs". Hvis tcsh ikke startes som login-kommandofortolker vil den (udover nogle systemopsætningsfiler) kun læse "~/.tcshrc". Det er altså i filen "~/.tcshrc" man som bruger kan vælge sin personlige opsætning af Tcsh.

Systemvariable sættes i Tcsh med setenv VARIABELNAVN VÆRDI. Bemærk at der bare er et mellemrum mellem variablens navn og den værdi den skal tildeles. Man kan se om en variabel er defineret ved at se på indholdet af ${?VARIABELNAVN}:

[tyge@hven ~]$ echo ${?PRINTER}
0
1 betyder at variablen er defineret og 0 at den ikke er defineret.

Til sammenligning kan vi så prøve at tildele variablen PRINTER navnet på vores foretrukne printer:

[tyge@hven ~]$ setenv PRINTER lp1
[tyge@hven ~]$ echo ${PRINTER}
lp1
[tyge@hven ~]$ env | grep PRINTER
printer=lp1

Tcsh har i øvrigt et lille irritationsmoment i forbindelse med at der bliver installeret nye programmer. De instanser af Tcsh der blev startet før et program blev installeret, kan først finde det, når man har kørt kommandoen rehash i dem.

www.linuxbog.dk/unix/eksempler/shells/tcsh kan findes et forslag til følgende ~/.tcshrc. På samme URL kan findes et forslag til ~/.login.

Eksempel 1-1. Eksempel på en .tcshrc-fil

#!/bin/tcsh
# User .tcshrc file (/bin/tcsh initialization).
# Peter Toft 2002 

# Omgåelse af en fejl i Red Hat 7.X
unset dspmbyte

# Anvend ssh til rsync
setenv RSYNC_RSH ssh

#Dansk tastaturopsætning og danske tekster i programmerne
setenv LC_ALL da_DK
setenv LANG da

# Led efter programmer i de følgende steder.
set path = ( /bin /usr/bin /usr/local/bin /usr/X11R6/bin )

if ( ! $?prompt ) exit  # Kommandofortolkeren er interaktiv

set history = 500       # 500 af de forrige kommandoer huskes
set savehist            # Number to save across sessions
set autolist            # List choices in name completion
set correct = cmd       # Checks spelling of commands

# Kommando-prompt med login-navn maskine og sti
set prompt  = "%{^[[1m%}${user}@`hostname`%/>%{^[[0m%} " 

# Findes en ~/.alias-fil med aliaser, da køres denne
if ( -e ~/.alias ) source ~/.alias

# Findes en ~/.complete.tcsh-fil, da køres denne
if ( -e ~/.complete.tcsh ) source ~/.complete.tcsh

Flere forslag til at skrive en ~/.tcshrc kan findes på http://tcshrc.sourceforge.net.

1.3.4. Korn Shell (ksh)

En af de halv-gamle kommandofortolkere med et ret avancerede scripting-muligheder er Korn Shell (ksh). Denne følger typisk med de kommercielle UNIX-varianter, men ikke med Linux. Der er udviklet en erstatning for ksh til Linux med navnet pdksh (Public Domain ksh). Denne anvendes dog ikke ret mange steder.

1.3.5. Zsh

Zsh er en af de mest avancerede kommandofortolkere der findes. Den ligner Bash og Ksh, men har – specielt ved interaktiv brug – mange fordele fremfor dem. Som med Tcsh kan man selv indstille filnavnsekspansionen. Desuden er den (som Bash) stort set kompatibel med Unix' standardsyntaks for kommandofortolkere. Det betyder at man kan nyde alle Zshs fordele som interaktiv kommandofortolker og bagefter kopiere de kommandoer man er kommet frem til direkte ind i et kommandofortolkerprogram, der i de fleste tilfælde vil kunne køre uændret på et vilkårligt unix-system.

tyge@hven:~% ls -al /etc/sh<TAB>
-rw-r--r--    1 root     root          185 sep 28  2000 /etc/shells

En rigtig smart ting som ingen af de andre kommandofortolkere har er et specielt jokertegn, **, der betyder underkataloger i en vilkårlig dybde:

tyge@hven:~% ls **/*.png
foldere/linux_på_dansk/friheden.png  foldere/sslug-folder/tux.png
images/tyge.png                      linuxbog/front.png
images/hanne.png                     linuxbog/sslug.png

Systemvariable sættes med export variabelnavn=VÆRDI, mens almindelige variable bare sættes med variabelnavn=VÆRDI:

tyge@hven:~% export printer=minlpr
tyge@hven:~% echo ${PRINTER}
minlpr
tyge@hven:~% huskeseddel=/tmp/husk
tyge@hven:~% echo ${huskeseddel}
/tmp/husk

Zsh bruger op til otte opsætningsfiler, hvoraf de fire ligger i ens eget hjemmekatalog, og de fire andre ligger i systemopsætningskataloget:

  1. /etc/zshenv (læses altid)

  2. ~/.zshenv (læses altid)

  3. /etc/zprofile (læses ved login)

  4. ~/.zprofile (læses ved login)

  5. /etc/zshrc (læses ved login og ved interaktiv brug)

  6. ~/.zshrc (læses ved login og ved interaktiv brug)

  7. /etc/zlogin (læses ved login)

  8. ~/.zlogin (læses ved login)

Første gang man starter Zsh, har man overhovedet ingen regler for fuldstændiggørelse af kommandoer og filnavne. Det kan man ændre på ved at køre den indbyggede kommando compinstall (det kan være nødvendigt først at køre kommandoen autoload -U compinstall). Du bliver så præsenteret for et primitivt menusystem, hvor du kan konfigurere fuldstændiggørelsen. I første omgang vil du nok kunne klare dig med standardindstillingerne.

Hvis de 500-600 fuldstændiggørelsesregler zsh kommer med som standard ikke er nok, kan man selvfølgelig lave flere. Hvis man f.eks. vil have zsh til kun at foreslå .ogg- og .mp3-filer når man har skrevet music123, kan man lægge en fil med indholdet:

#compdef music123

_files -g '*.(ogg|mp3)'
i /usr/local/share/zsh/site-functions/. Den første linje fortæller at denne funktion skal bruges når det er argumenter til music123 der fuldstændiggøres, og den anden linje at kun filer der passer til det angivne mønster skal bruges.

Man kan naturligvis bladre tilbage gennem sine gamle kommandoer med pil op/ned, og ændre i en kommando inden man udfører den igen. Til dette formål kan man både få Emacs- og vi-tastebindinger, hvis en EDITOR- eller VISUAL-variabel er sat til en af tingene vælger Zsh automatisk de tilsvarende tastebindinger.

Der er eksempler på hvordan de fire brugerdefinerede filer kan se ud i bogens eksempler (www.linuxbog.dk/unix/eksempler/shells/zsh/).

Zshs hjemmeside findes på SunSite.dk, hvor man også kan finde en brugsanvisning: http://zsh.sunsite.dk/Guide/.

1.3.6. Bourne Shell (sh)

En af de ældste kommandofortolkere til UNIX-familien er Bourne Shell (sh). Den har den fordel, at alle UNIX-maskiner har den installeret, og den dermed er egnet til at lave portabel kode. Som kommandofortolker er Bourne Shell imidlertid ret så skrabet og har slet ikke de smarte egenskaber, der findes i de nyere kommandofortolkere.

På Linux systemer er det ofte bash, som opfører sig sig som sh, når den bliver startet med det navn (fx. gennem et link). Det kalder man, at den kører i posix modus. I så fald aktiverer den ikke de "smarte features": completion, kommando-editor og history.

Ligesom bash, zsh og ksh sættes miljø-variable med export.

[tyge@hven ~]$ sh
sh-2.05$ dd=3
sh-2.05$ export dd
sh-2.05$ echo $dd
3