Je tekstomgeving aanpassen

Variabelen die je omgeving beïnvloeden

Wat doen variabelen?

We hadden het al enkele keren over omgevingsvariabelen zoals PATH en MANPATH. Tot nu toe zagen we ze enkel in voorbeelden, waarin ze een specifieke betekenis hebben voor de shell. Maar er zijn vele andere Linux gereedschappen die informatie nodig hebben over jou en je omgeving, om hun werk te kunnen doen.

Welke andere informatie is er beschikbaar naast de twee paden PATH en MANPATH? We zetten de belangrijkste even op een rijtje:

  • Vele programma's willen weten welke soort terminal je gebruikt. Aan de hand van het terminaltype weten de programma's over hoeveel lijnen en kolommen ze beschikken om alles netjes op je scherm te zetten. In pure tekstmode (Ctrl+Alt+F-toetsen vanuit de grafische mode, weet je nog) is het terminaltype linux, in een terminal venster in grafische mode is dat xterm.

  • In het geval een programma in een subproces een editor moet starten, vindt het de naam van je favoriete tekst editor in de variabele EDITOR.

  • Informatie over je besturingssysteem wordt opgeslagen in de variabele OSTYPE, die bij de installatie van sommige pakketten gebruikt wordt om te controleren of het pakket wel past op je systeem.

Het printenv commando

Een lijst van alle variabelen die in de huidige shell sessie gedefinieerd zijn, kan je op het scherm tonen met het commando printenv. De output ziet er als volgt uit:

Handeling met de muis.

willy@ubuntu:$ printenv
SSH_AGENT_PID=7091
TERM=xterm
DESKTOP_STARTUP_ID=
SHELL=/bin/bash
GTK_RC_FILES=/etc/gtk/gtkrc:/home/willy/.gtkrc-1.2-gnome2
WINDOWID=41943142
USER=willy
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:c
d=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:
*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*
.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01
;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.ti
ff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;3
5:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01
;35:
GNOME_KEYRING_SOCKET=/tmp/keyring-5psAzF/socket
SSH_AUTH_SOCK=/tmp/ssh-AlXIEc7053/agent.7053
SESSION_MANAGER=unix/ubuntu:/tmp/.ICE-unix/7053
USERNAME=willy
DESKTOP_SESSION=default
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/
usr/games
GDM_XSERVER_LOCATION=local
PWD=/usr/share/doc/grep
LANG=nl_NL.UTF-8
GDM_LANG=nl_NL.UTF-8
GDMSESSION=default
HOME=/home/willy
SHLVL=1
LANGUAGE=nl_NL.UTF-8
GNOME_DESKTOP_SESSION_ID=Default
LOGNAME=willy
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-m55HuFBTQv,guid=020a89375a0be95
5996b79b6317b5300
LESSOPEN=| /usr/bin/lesspipe %s
DISPLAY=:0.0
LESSCLOSE=/usr/bin/lesspipe %s %s
COLORTERM=gnome-terminal
XAUTHORITY=/home/willy/.Xauthority
_=/usr/bin/printenv
OLDPWD=/usr/share/doc

Zo zien we bijvoorbeeld dat de naam van de gebruiker wordt opgeslagen in de variabele USERNAME, en het pad naar de home map van de gebruiker in de variabele HOME.

Omgevingsvariabelen vs. gewone variabelen

Onder “gewone” variabelen verstaan we variabelen die door de gebruiker zelf ingesteld worden, bijvoorbeeld door het commando export MIJN_VARIABELE=BIS.

De omgevingsvariabelen worden beheerd door de shell. In tegenstelling tot gewone variabelen, erft elk proces dat je start, de omgevingsvariabelen van de shell. Ook wanneer je een nieuwe shell start, erft die de omgevingsvariabelen van de shell van waaruit hij gestart werd. De nieuwe processen krijgen een kopie van de set omgevingsvariabelen, die ze kunnen lezen, aanpassen en op hun beurt kunnen doorgeven aan hun eigen child processen.

Er is niets speciaals aan namen van variabelen, behalve dat ze gewoonlijk, maar dit enkel uit gewoonte, in hoofdletters geschreven worden. Dat is echter geen verplichting. Ook een mix van grote en kleine letters is toegestaan. Er zijn twee beperkingen:

  1. Namen van variabelen mogen niet met een cijfer beginnen. Ze mogen verder wel cijfers bevatten.

  2. Er zijn een aantal standaardvariabelen die hetzelfde zijn op elk Linux systeem, zoals PATH en HOME. Deze variabelen laat je best onveranderd.

Het bovenstaande printenv commando geeft al een overzicht van de standaardvariabelen. We bespreken ze zodadelijk in meer detail.

Het set commando

Alle variabelen die momenteel gedefinieerd zijn, of ze nu geërfd zullen worden door child processen of niet, krijg je te zien door middel van het set commando.

[Belangrijk]Voer het set commando uit

Je zal merken dat de lijst van de variabelen die door set weergegeven wordt, veel langer is dan de lijst van omgevingsvariabelen, die printenv je geeft. Alle variabelen die niet in de printenv output voorkomen, worden niet doorgegeven. Ze zijn specifiek voor de huidige shell sessie. Zo bijvoorbeeld vind je in de set output informatie over de commandogeschiedenis in HISTFILE en HISTFILESIZE, die niet wordt doorgegeven aan child processen.

De inhoud van variabelen veranderen

De inhoud tonen

Zoals we reeds enkele malen zagen, kan je de inhoud van een variabele tonen met behulp van het echo commando:

Handeling met de muis.

willy@ubuntu:~$ echo $HOME
/home/willy
willy@ubuntu:~$ echo $OSTYPE
linux-gnu

Merk het dollarteken op, waarmee we aangeven dat echo de inhoud van een variabele moet tonen, en niet gewoon de opgegeven string op het scherm moet drukken. OSTYPE is een systeemvariabele die door de gebruiker opgevraagd kan worden (en dus geen omgevingsvariabele, ze zit ook niet in de output van printenv. Deze variabele bevat informatie over het soort besturingssysteem waarmee je werkt.

De inhoud veranderen

Om de inhoud van een variabele te wijzigen, gebruiken we de syntax

VARIABELE=waarde

Bijvoorbeeld:

Handeling met de muis.

willy@ubuntu:~$ PINGUIN=Tux

Zo wordt de serie van karakters “Tux” toegekend als inhoud van de variabele PINGUIN. Als de variabele al een inhoud had, wordt deze nu overschreven.

Denk eraan om dubbele aanhalingstekens te gebruiken als de waarde van de variabele spaties bevat. Gebruik enkele aanhalingstekens als de waarde van de variabele tekens bevat die een speciale betekenis hebben voor de shell, zoals *, $, ` en \.

Als de naam van de variabele nog niet gekend is in de huidige shell sessie, wordt automatisch een nieuwe variabele met de opgegeven waarde aangemaakt.

Het export commando

Om een variabele te markeren als omgevingsvariabele, waarvan de waarde zal worden doorgegeven aan child processen, is er het export commando:

export VARIABELE

Onderstaande oefening maakt duidelijk waarom het nodig is variabelen te exporteren.

[Belangrijk]Voor en na
  • Maak zoals in bovenstaand voorbeeld de variabele PINGUIN aan.

  • Start een nieuwe shell sessie, bijvoorbeeld met het commando bash of xterm.

  • Vraag de inhoud van de PINGUIN variabele op in de nieuwe shell.

  • Wat gebeurt er?

  • Verlaat de nieuwe shell.

  • Exporteer de PINGUIN variabele.

  • Start weer een nieuwe shell.

  • Vraag de inhoud van de PINGUIN variabele op in de nieuwe shell.

  • Wat gebeurt er?

  • Verlaat de tweede shell.

Gewoonlijk wordt het instellen en exporteren van een variabele in één enkele stap uitgevoerd:

export VARIABELE=waarde

Informatie toevoegen aan de waarde van een variabele

Soms is het nodig om de bestaande inhoud van een variabele te bewaren, naast de nieuwe informatie. Bijvoorbeeld als je nieuwe software installeert. De uitvoerbare bestanden van een nieuw pakket zouden bijvoorbeeld in /opt/app/bin kunnen staan. Dat is een pad dat niet standaard afgezocht wordt wanneer je een commando ingeeft. Bijgevolg krijg je een foutmelding als je dat nieuwe commando wilt uitvoeren, dat zich bevindt in die /opt/app/bin map. Ga als volgt te werk om het nieuwe pad aan de reeks bestaande paden te hangen:

willy@ubuntu:$ echo $PATH
/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/g
ames
willy@ubuntu:$ export PATH=$PATH:/opt/app/bin
willy@ubuntu:$ echo $PATH
/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/g
ames:/opt/app/bin
[Opmerking]Standaard paden

Zo'n aanpassing van de PATH variabele is normaalgezien niet nodig. Alle pakketten die je op de in deze cursus beschreven manier kan installeren, gebruiken de mappen die al standaard in de PATH variabele bepaald zijn. In grotere omgevingen, bijvoorbeeld op het werk waar de informatici zelf programma's schrijven, kan het echter wel eens voorkomen dat je afwijkingen ziet. Meestal wijkt men af van de standaard om een onderscheid te maken tussen programma's die bij het systeem horen en programma's die eigen zijn aan het bedrijf.

Met which kan je nu ook nagaan dat het nieuwe commando in de nieuwe map gevonden wordt.

Zorg ervoor dat commando's die je veel gebruikt aan het begin van het pad staan. Zo worden ze sneller gevonden. Zou je het nieuwe commando in /opt/app/bin bijvoorbeeld meerdere keren per shell sessie nodig hebben, dan is het de moeite waard te overwegen om het eerst te zetten in de definitie van de PATH variabele, zodat het ook eerst gevonden wordt. Dat doe je als volgt:

export PATH=/opt/app/bin:$PATH

Controleer het resultaat altijd met het echo commando.

Denk eraan om ook de paden voor de man pagina's aan te passen wanneer er nieuwe pagina's meegeleverd worden met nieuwe software. Dat doe je in de MANPATH variabele.

Een variabele verwijderen

Gebruik het unset commando om een variabele uit de set lijst te halen:

Handeling met de muis.

willy@ubuntu:~$ unset PINGUIN
willy@ubuntu:~$ echo $PINGUIN

willy@ubuntu:~$ 

Voorbehouden variabelen

De volgende tabel geeft een overzicht van de variabalen die voorbehouden zijn voor gebruik door de shell. Deze variabelen worden doorgaans niet gebruikt voor andere doeleinden dan diegene die hieronder opgegeven worden.

Tabel 8.1. Omgevingsvariabelen

Naam van de variabeleOpgeslagen informatie
DISPLAYGebruikt door de grafische omgeving.
DOMAIN(DNS) Domeinnaam voor netwerkverbindingen.
EDITORWelke editor wordt er opgestart, bijvoorbeeld wanneer je het crontab commando gebruikt.
HISTSIZEAantal commando's dat bijgehouden wordt in de shellgeschiedenis.
HOMEPad naar je home map.
HOSTNAMENaam van de machine waarop je werkt.
INPUTRCPlaats van de definitiebestanden voor input apparaten zoals het toetsenbord.
LANGVoorkeurstaal.
LD_LIBRARY_PATHPaden naar bibliotheekbestanden.
LOGNAMEGebruikersnaam.
MAILLocatei van de folder voor binnenkomende mail.
MANPATHPaden naar man pagina's.
OSString die het besturingssysteem bepaalt.
OSTYPEMeer informatie over de versie van het besturingssysteem.
PAGERNaam van het programma dat gebruikt wordt door man en dergelijke, wanneer de output langer is dan 1 scherm.
PATHPaden naar commando's.
PS1Primaire prompt.
PS2Secondaire prompt.
PWDNaam van de huidige map.
SHELLNaam en pad van de huidige shell.
TERMTerminal type.
UIDIdentificatienummer van de gebruiker.
USER(NAME)Gebruikersnaam.
VISUALKan de naam van een editor bevatten die het gehele scherm in beslag neemt wanneer hij opgestart wordt (full-screen editor).
XENVIRONMENTLocatei van het bestand dat jouw persoonlijke instellingen bevat voor de server van de grafische omgeving.
XFILESEARCHPATHPaden naar grafische bibliotheken.

Vele van deze variabelen hebben niet alleen een vaste funktie, de waarde ervan is meestal ook vastgelegd in configuratiebestanden. Die bespreken we hierna.

Configuratiebestanden van de shell

/etc/profile

Het eerste bestand dat de shell opzoekt en, indien het bestaat op je systeem, inleest, is /etc/profile. Dit bestand is voor iedereen leesbaar, het bevat dan ook instellingen voor de shell die gelden voor alle gebruikers op het systeem. Onze /etc/profile ziet er als volgt uit:

Handeling met de muis.

willy@ubuntu:~$ cat -n /etc/profile
1  # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
2  # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
3
4  if [ "`id -u`" -eq 0 ]; then
5    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin
/X11"
6  else
7    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin
/X11:/usr/games"
8  fi
9
10  if [ "$PS1" ]; then
11    if [ "$BASH" ]; then
12      PS1='\u@\h:\w\$ '
13      if [ -f /etc/bash.bashrc ]; then
14          . /etc/bash.bashrc
15      fi
16    else
17      if [ "`id -u`" -eq 0 ]; then
18        PS1='# '
19      else
20        PS1='$ '
21      fi
22    fi
23  fi
24
25  export PATH
26
27  umask 022

Voor het gemak hebben we het afgebeeld met cat -n, zodat de lijnen genummerd zijn. Zonder al te veel in te gaan op de details - die houden we voor een shell scripting cursus - zien we hier het volgende:

  • Lijn 1-2: beginnen met een hekje (#): commentaar, deze lijnen worden niet gelezen door de shell.

  • Lijn 4-8: als je systeembeheerder bent (gebruikersidentificatienummer = 0), krijg je een andere instelling voor de PATH variabele dan wanneer je een gewone gebruiker bent. Het concrete verschil is in dit geval dat een systeembeheerder geen spelletjes speelt: /usr/games staat niet in het PATH van deze gebruiker.

  • Lijn 10-23: Op basis van het bestaan van een instelling voor de primaire prompt, PS1, en als de shell Bash is, wordt het configuratiebestand /etc/bash.bashrc ingelezen. Wanneer dat bestand niet bestaat, krijgt de systeembeheerder een hekje als prompt en gewone gebruikers een dollarteken.

  • Lijn 25: het pad wordt geëxporteerd.

  • Lijn 27: de waarde van het masker voor aanmaken van bestanden wordt ingesteld, zie de paragraaf “Standaardbeveiliging”.

Het bestand /etc/profile wordt ook door andere shells dan Bash ingelezen. Op systemen waar er zowel Bash- als andere gebruikers zijn, moet men er dus over waken dat in /etc/profile enkel opdrachten staan die door alle shells ingelezen kunnen worden. Vandaar dat men op een Linux machine veel het verschijnsel ziet dat er getest wordt of de shell, die /etc/profile inleest, een Bash shell is. De instellingen die specifiek zijn voor Bash, maar die soms niet begrepen worden door andere shells, zet men dan in een apart bestand, in dit geval /etc/bash/bashrc. Je zal echter zien dat dit bestand voornamelijk bestaat uit commentaarlijnen.

~/.bash_profile

Na de algemene instellingen gaat de shell op zoek naar specifieke instellingen per gebruiker. Die staan voornamelijk in twee bestanden in je home map, die wordt aangeduid met de tilde (~). Het eerste bestand is .bash_profile, waarvan hieronder een voorbeeld - gebruik het cat commando om jouw eigen .bash_profile te zien.

Handeling met de muis.

1  # ~/.bash_profile: executed by bash(1) for login shells.
2  # see /usr/share/doc/bash/examples/startup-files for examples.
3  # the files are located in the bash-doc package.
4
5  # the default umask is set in /etc/login.defs
6  #umask 022
7
8  # include .bashrc if it exists
9  if [ -f ~/.bashrc ]; then
10      . ~/.bashrc
11  fi
12
13  # set PATH so it includes user's private bin if it exists
14  if [ -d ~/bin ] ; then
15      PATH=~/bin:"${PATH}"
16  fi

In de standaardversie vinden we vooral weer veel commentaarlijnen. Verder nog de volgende instellingen:

  • Lijn 9-11: Als het bestand .bashrc bestaat in de home map van de gebruiker, wordt dat ingelezen.

  • Lijn 14-16: Als de gebruiker een bin heeft in zijn/haar home map, wordt die toegevoegd aan het pad.

~/.bashrc

Als laatste wordt het bestand .bashrc in de home map van de gebruiker ingelezen. Gebruik cat om jouw versie te zien:

Handeling met de muis.

1  # ~/.bashrc: executed by bash(1) for non-login shells.
2  # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
3  # for examples
4
5  # If not running interactively, don't do anything
6  [ -z "$PS1" ] && return
7
8  # don't put duplicate lines in the history. See bash(1) for more options
9  #export HISTCONTROL=ignoredups
10
11  # check the window size after each command and, if necessary,
12  # update the values of LINES and COLUMNS.
13  shopt -s checkwinsize
14
15  # make less more friendly for non-text input files, see lesspipe(1)
16  [ -x /usr/bin/lesspipe ] && eval "$(lesspipe)"
17
18  # set variable identifying the chroot you work in (used in the prompt below)
19  if [ -z "$debian_chroot" -a -r /etc/debian_chroot ]; then
20      debian_chroot=$(cat /etc/debian_chroot)
21  fi
22
23  # set a fancy prompt (non-color, unless we know we "want" color)
24  case "$TERM" in
25  xterm-color)
26      PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
27      ;;
28  *)
29      PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
30      ;;
31  esac
32
33  # Comment in the above and uncomment this below for a color prompt
34  #PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
35
36  # If this is an xterm set the title to user@host:dir
37  case "$TERM" in
38  xterm*|rxvt*)
39      PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
40      ;;
41  *)
42      ;;
43  esac
44
45  # Alias definitions.
46  # You may want to put all your additions into a separate file like
47  # ~/.bash_aliases, instead of adding them here directly.
48  # See /usr/share/doc/bash-doc/examples in the bash-doc package.
49
50  #if [ -f ~/.bash_aliases ]; then
51  #    . ~/.bash_aliases
52  #fi
53
54  # enable color support of ls and also add handy aliases
55  if [ "$TERM" != "dumb" ]; then
56      eval "`dircolors -b`"
57      alias ls='ls --color=auto'
58      #alias dir='ls --color=auto --format=vertical'
59      #alias vdir='ls --color=auto --format=long'
60  fi
61
62  # some more ls aliases
63  #alias ll='ls -l'
64  #alias la='ls -A'
65  #alias l='ls -CF'
66
67  # enable programmable completion features (you don't need to enable
68  # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
69  # sources /etc/bash.bashrc).
70  #if [ -f /etc/bash_completion ]; then
71  #    . /etc/bash_completion
72  #fi

Het lijkt ingewikkeld, maar eens te meer leest de shell geen enkele lijn die begint met een hekje. Dan blijven volgende instellingen over:

  • Lijn 6: Als de shell opgeroepen wordt als niet-interaktief is er geen prompt en geen venster om informatie in te tonen. Dan moeten ook alle volgende instellingen niet gebeuren. Een niet-interaktieve shell is er bijvoorbeeld een die opgeroepen wordt vanuit cron of at.

  • Lijn 13: Controleert de instellingen van de terminal of het terminal venster.

  • Lijn 16: Configureert het gedrag van het less commando.

  • 19-21: Instellingen voor speciale, afgeschermde omgevingen, soms door ontwikkelaars gebruikt.

  • Lijn 24-43: Verdere instellingen voor de prompt, die kan bijvoorbeeld ook in kleur, zie de volgende paragraaf.

  • Lijn 55-60: Instellingen die ervoor zorgen dat ls bestandsnamen in kleur toont, afhankelijk van het type, zie de paragraaf “Bestanden tonen met ls”.

Aanpassen van de standaardinstellingen voor je eigen omgeving doe je voornamelijk in dit bestand, .bashrc in je home map. Om het bestand te bewerken gebruik je een tekst editor. Hierna bespreken we enkele van de meest voorkomende aanpassingen.

Je eigen instellingen maken voor de shell

Opties van de shell

Het set commando voor opties

Zoals we reeds zagen in de paragraaf “Het set commando”, geeft het set commando zonder opties een overzicht van alle variabelen die gedefinieerd zijn in een shell omgeving. Met de -o optie kan je ook opties van de shell in beeld brengen:

willy@ubuntu:~$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

Eens te meer zien we hier een overvloed aan informatie, en het zou ons te ver leiden om op elk onderdeel dieper in te gaan. Laat het hier volstaan te zeggen dat de belangrijkste opties aktief zijn. Uitgebreide informatie kan je vinden in de info pagina's van bash. Als voorbeeld van hoe je een optie kan aktiveren, bespreken we hierna de noclobber optie.

Overschrijven voorkomen

Toen we het in hoofdstuk 6 hadden over output naar een bestand sturen (zie de paragraaf “Overschrijven voorkomen”), zagen we reeds dat we de noclobber optie moesten aktiveren om te voorkomen dat we bestanden accidenteel zouden overschrijven.

[Belangrijk]Een optie aktiveren

Voeg de volgende regels toe aan je .bashrc om deze instelling permanent te maken:

# Overschrijven van bestanden voorkomen:
set +o noclobber

Doe de toevoeging bij voorkeur aan het einde van het bestand, en laat de regel voorafgaan door een regel commentaar, zodat je later niet hoeft te zoeken wat deze instelling betekent.

Test het resultaat: probeer een bestaand bestand te overschrijven.

[Opmerking]Opties desaktiveren

Vreemd genoeg gebruikt de shell syntax in het geval van set een plus-teken om een optie te desaktieveren:

set +o naam_van_de_optie

[Tip]De nieuwe instellingen aktief maken

Om de nieuwe shell instellingen te aktieveren, moet je een nieuwe shell openen. Dat is misschien niet altijd gewenst of mogelijk. Gebruik het volgende commando om het configuratiebestand opnieuw in te lezen in dezelfde shell:

source .bashrc

Aliasen

Aliasen maken is een manier om veel gebruikte commando's een korte, makkelijke naam te geven. Je vindt bijvoorbeeld al volgende alias in je .bashrc:

alias ls='ls --color=auto'

Dat wil zeggen dat telkens wanneer je ls oproept, je eigenlijk ls --color=auto uitvoert. Je hoeft er echter niet aan te denken steeds deze optie in te geven. Dit geeft ook meteen de syntax weer voor het alias commando, waarmee de aliasen ingesteld worden:

alias commando='commando -opties'

In een alias kan je slechts één enkel commando opgeven. Het is niet mogelijk een combinatie van commando's op te geven met behulp van pipes en andere input of output redirection operatoren.

[Belangrijk]Het ll commando

Een veelgebruikte alias voor ls is ll, waarbij eigenlijk ls -l wordt uitgevoerd. Deze alias is al voorgedefinieerd in je .bashrc, maar hij staat nog in commentaar. Maak gebruik van je pasverworven kennis van vim om de desbetreffende lijn op te zoeken, het commentaarteken (#) aan het begin van de lijn te verwijderen en zo de alias ll aktief te maken.

Test het resultaat!

Scripts schrijven

Wat zijn scripts?

In zekere zin zijn de shell configuratiebestanden voorbeelden van scripts: het zijn tekstbestanden die shell commando's bevatten. Scripts worden uitgevoerd door een niet-interaktieve shell, die de lijnen van het script de ene na de andere leest en uitvoert. Als het einde van het script bereikt is, sluit de shell. Verwar een niet-interaktieve shell niet met het feit of het script al dan niet interaktief is: een script kan input van de gebruiker verwachten.

In tegenstelling tot de configuratiebestanden, die eigenlijk een speciaal geval zijn, is een echt script altijd een uitvoerbaar bestand. Met het chmod commando zorg je daarvoor. Normaalgezien moet een script op zijn minst uitvoerbaar zijn voor de gebruiker die het gemaakt heeft. Dit doe je als volgt:

chmod u+x naam_van_het_script

Een script begint met de karakters “#!”, in het Engels: hash bang. Daarna volgt het pad naar het commando dat het script inleest, in ons geval is dat de Bash shell, en het pad ernaartoe is /bin/bash. In het totaal wordt de eerste regel voor een Bash script dus:

#!/bin/bash

Daarna volgende de commando's die de shell zal moeten uitvoeren.

[Let op]Namen van scripts

Kies een zinvolle naam als je een script maakt. Vergewis je ervan met bijvoorbeeld which of locate dat de naam die je gaat gebruiken, niet dezelfde is als die van een bestaand commando, dat zou verwarrend zijn.

Voorbeeld met echo

Een zeer eenvoudig voorbeeld van een script dat uit slechts twee lijnen bestaat: echo met een variabele.

[Belangrijk]hello.sh

Je deed al min of meer hetzelfde met behulp van de nano editor. Gebruik nu vim om het script te maken.

  • Start de procedure met het commando vim hello.sh, gevolgd door Enter. Je komt in de editor terecht.

  • Ga in invoegmode.

  • Geef de volgende regels op:

    #!/bin/bash
    echo "hello $USER"
    
  • Verlaat de editor: druk Esc en geef het commando :wq op.

  • Maak het script uitvoerbaar:

    chmod u+x hello.sh

  • Voer het script uit:

    ./hello.sh

  • Waarom moet je de naam van het script ook alweer laten vooraf gaan door de tekens “./”? Wat zou je kunnen doen om deze situatie makkelijker te maken?

Voorbeeld met who

Een iets moeilijker voorbeeld, maar nog steeds met slechts twee lijnen. Ditmaal zetten we drie commando's met pipes aan elkaar om een overzichtelijke lijst van verbonden gebruikers te geven. Eerst vragen we met who op wie er aangemeld is. De output van dat commando gaat naar cut, dat de eerste kolom eraf knipt. Daarna wordt de output uniek gesorteerd:

[Belangrijk]wie.sh

Maak het script met volgende inhoud nu zelf:

#!/bin/bash
who | cut -d " " -f1 | sort -u

Maak het script uitvoerbaar met chmod en test.

Voorbeeld met twee commando's

In het volgende voorbeeld voeren we twee commando's uit. Het script geeft informatie over de processor van je computer.

#!/bin/bash
echo "Deze CPU zit in deze computer:"
grep "model name" /proc/cpuinfo
[Belangrijk]Mooier

Maak dit script met een kleine aanpassing: gebruik het cut commando met als scheidingskarakter tussen velden de dubbele punt. Druk enkel het tweede veld van de lijn af die begint met “model name”.

Voorbeeld: zelf een variabele instellen

In het volgende voorbeeld steken we de output van een commando in een variabele met behulp van backticks (zie de paragraaf “De crontab editeren”).

#!/bin/bash
GEHEUGEN=`grep MemTotal /proc/meminfo | cut -d ":" -f2`
echo "In deze computer zit veel geheugen: $GEHEUGEN"