Tips en Trucs 2011

Bash instellen

Vandaag bekijken we hoe je bash kunt instellen, hoe je aliassen gebruikt en nog wat tips om uw shell beter te leren kennen. De shell leren gebruiken is een een marathon en geen sprint. Dit vraagt dus tijd en veel training (oefening). Deze tip zorgt voor wat training.

Bash instellen

Bash bekijkt bij het opstarten verschillende configuratiebestanden. Indien bash start als een login shell (bij het aanmelden) worden de volgende configuratiebestanden bekeken: Als bash niet als een login shell wordt gestart, bijvoorbeeld bij het starten van een terminal emulator (terminal in een venster) zoals Konsole en Gnome Terminal, dan worden de volgende configuratiebestanden bekeken:

Even opfrissen: de tilde (~) is een verkorte schrijfwijze voor de persoonlijke map. M.a.w. ~/.bashrc wordt door de shell uitgebreid tot /home/gebruiker/.bashrc.

Om de shell aan te passen, moet je het bestand ~/.bash_profile voor een shell met aanmelden en het bestand ~/.bashrc voor shells zonder aanmelden aanpassen.

Een eenvoudig voorbeeld:
# Stel hier uw favoriete teksteditor in
export EDITOR=/usr/bin/joe
# Aliases instellen
if [ -f ~/.bash_aliases ]; then 
    . ~/.bash_aliases
fi

De regels die beginnen met hekjes (#) zijn commentaar. De shell zal deze regels negeren. De tweede regel zet de EDITOR omgevingsplaatshouder (environment variable) op joe. Bash weet zo dat joe uw standaard teksteditor is.

De drie laatste regels zorgen ervoor dat bash het bestand ~/.bash_aliases leest, indien het bestaat. Dit bestand bevat aliassen (zie verder). Het lijkt nogal raadselachtig, maar de regel . ~/.bash_aliases betekent: plaatst hier de inhoud van het bestand ~/.bash_aliases.

Het pad naar de opdrachten

Bij het intypen van een opdracht in de shell, zoekt bash in specifieke mappen naar de opdracht. Als je ls in een shell typt, zal bash de opdracht ls enkel uitvoeren als bash de opdracht ls in deze specifieke mappen kan vinden. Indien bash de opdracht ls niet in het path (de specifieke mappen) vindt, kan bash de opdracht niet uitvoeren. Indien de opdracht ls in verschillende path mappen voorkomt, zal bash de eerst gevonden opdracht uitvoeren.

Je kan de specifieke path mappen opvragen met:
echo $PATH
Het resultaat van deze opdracht lijkt op:
/home/dany/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin

Elke map waarin bash naar opdrachten zoekt, wordt door komma's gescheiden. Merk op dat de eerste map die door bash bekeken wordt, de bin map in mijn persoonlijke map is, daarna /usr/local/bin, daarna /usr/bin, enz.

Je kunt mappen aan het path toevoegen door de bestanden ~/.bashrc en ~/.bash_profile aan te vullen met de volgende opdracht:
PATH="$HOME/bin:$PATH"

Nader bekeken, betekent PATH= dat het path ge(her)definieerd wordt. $HOME/bin voegt de map bin in de persoonlijke map toe aan path. $PATH voegt de oude reeds in path aanwezige mappen eveneens toe aan path. Dubbele punten scheiden de verschillende onderdelen.

Uw ~/.bash_profile en/of ~/.bashrc bestanden bevatten waarschijnlijk reeds de volgende gelijkaardige regels:
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Deze regels testen of er een map bin in uw persoonlijke map bestaat en voegt deze indien aanwezig toe aan path.

Aliassen

Een alias is een tekenreeks dat door bash vervangen wordt door een opdracht. Een eenvoudig voorbeeld:
alias ls='ls --color=auto'

Dit zorgt ervoor dat bij het uitvoeren van de opdracht ls bash ls zal vervangen door de opdracht ls --color=auto.

Je kunt aliassen in een shell instellen, ideaal om ze te testen, maar het lijkt me logischer om aliassen op te slaan in uw ~/.bash_profile en ~/.bashrc configuratiebestand. Of maak een bestand ~/.aliases aan en lees deze in uw configuratiebestanden als volgt in:
if [ -f ~/.bash_aliases ]; then 
    . ~/.bash_aliases
fi
Om de reeds in ingestelde aliassen op te sommen, voer je de opdracht alias uit. Je zult verwonderd zijn van wat uw distributie reeds standaard heeft ingesteld. Hier volgt de standaard voor openSUSE 11.3:
alias +='pushd .'
alias -='popd'
alias ..='cd ..'
alias ...='cd ../..'
alias beep='echo -en "\007"'
alias cd..='cd ..'
alias dir='ls -l'
alias l='ls -alF'
alias la='ls -la'
alias ll='ls -l'
alias ls='ls $LS_OPTIONS'
alias ls-l='ls -l'
alias md='mkdir -p'
alias o='less'
alias rd='rmdir'
alias rehash='hash -r'
alias unmount='echo "Error: Try the command: umount" 1>&2; false'
alias you='if test "$EUID" = 0 ; then /sbin/yast2 online_update ; else su - -c "/sbin/yast2 online_update" ; fi'

Als oefening kun je kijken welke standaard aliassen op uw systeem gebruikt worden. En kun je er een paar zelf aan toevoegen.

Shell uitbreiding

Voor het uitvoeren van een opdracht zal bash de opdracht evalueren en eventuele aliassen en uitdrukkingen gepast uitbreiden. Je kent reeds uitbreidingen van aliassen en de tilde (~) die uitgebreid wordt naar $HOME.

Bash breidt een aantal tekens uit naar één of meerdere andere tekens (beter bekend als jokers of wildcards). Het gebruik van patroonherkenning kan zeer nuttig zijn. Een voorbeeld: om alle JPEG-bestanden in een map op te sommen, gebruik je de opdracht ls *jpg en bash breidt dit uit tot alle bestanden die eindigen op jpg.

Om maar één teken voor te stellen, gebruik je ?. M.a.w. de opdracht ls ?.jpg somt bestanden zoals 1.jpg of a.jpg op, maar niet 01.jpg.

Met behulp van rechte haken kun je een set tekens opgeven. Bij het gebruik van [abc12] zal bash uitbreiden tot één teken die beperkt wordt door de opgegeven tekens. M.a.w. de opdracht ls -lh [abc12].jpg somt bestanden zoals a.jpg, b.jpg, c.jpg, 1.jpg and 2.jpg op, maar niet 12.jpg of abc.jpg.

Je kunt de werking ook omkeren door gebruik te maken van het uitroepteken (!). M.a.w. ls -lh [!ab12].jpg somt bestanden zoals c.jpg of 3.jpg op, maar niet 2.jpg.

Een andere handige truc is het gebruik van accolades. Bij mappenstructuren met mappen per jaar (2011) met submappen per maand (01 tot en met 12), kun je de submappen in één kaar aanmaken met de opdracht:
mkdir 2011/{01..12}
Bash zal dit uitbreiden tot twaalf mappen beginnend met 01 en eindigend met 12. Dit werkt ook met letters. Om 26 mappen te maken met namen van a tot en met z, gebruik je de opdracht:
mkdir {a..z}
Vanzelfsprekend werkt dit ook met hoofdletters.

Dit werkt ook met door komma's gescheiden waarden. Veronderstel dat je een map vol afbeeldingen in het JPEG, PNG en GIF formaat moet verplaatsen naar een map met afbeeldingen. De opdracht mv *.jpg *.png *.gif /afbeeldingen voert dit perfect uit. Een iets kortere opdracht is: mv *.{jpg,gif,png} /afbeeldingen.

Een andere handige uitbreiding is de opdrachtsubstitutie. Dit is vooral handig als je het resultaat van een opdracht wilt opnemen in een andere opdracht. De schrijfwijze (syntax) is:
opdracht `andere opdracht`
Bash voert eerst de opdracht "andere opdracht" uit en voert daarna de eerste opdracht met het resultaat van de andere opdracht uit. Een voorbeeld: om een bestand aan te maken als naam de huidige datum, gebruik je:
touch `date +%F`.txt

Het resultaat van de opdracht date +%F is het jaar, de maand en de dag gescheiden door mintekens. Je maakt dus afhankelijk van de huidige datum het bestand 2011-05-13.txt aan.