Linux-shell bash instellen en van kleur voorzien
Minder typen en sneller werken: pas de Linux-shell Bash aan jouw specifieke behoeften aan. Eigen functies maken je werk veel makkelijker. We geven nuttige suggesties vanuit de praktijk
Als je bij een Linux- of Unix-systeem op de commandline werkt, gebruik je in de meeste gevallen Bash. Die shell haalt je instellingen bij het opstarten op uit verschillende configuratiebestanden. Het belangrijkste is .bashrc (let op de punt in de naam). Dat bestand staat in de homedirectory en bevat alle persoonlijke instellingen van de gebruiker. Als het nog ontbreekt, maak het dan gewoon met een tekstverwerker.
Bash leest het .bashrc-configuratiebestand bijvoorbeeld wanneer je een terminalvenster op de desktop opent en dat daarmee als een interactieve shell start. In andere gevallen negeert Bash het bestand echter, bijvoorbeeld wanneer je het start als een login-shell, wanneer je de haakjesnotatie (...) gebruikt om een sub-shell te starten of wanneer je commando-substitutie gebruikt – oftewel een commando tussen backticks zet (`).
Wanneer een shell-script wordt gestart, wordt een niet-interactieve shell gemaakt die, naast ~/.bashrc, ook naar het bestand kijkt dat in de omgevingsvariabele BASH_ENV gespecificeerd is. Op de meeste systemen is BASH_ENV echter niet ingesteld en dan blijft alleen ~/.bashrc over. Ubuntu gebruikt ook het bestand /etc/bash.bashrc, dat systeembrede instellingen biedt voor een interactieve shell.
KETTINGREACTIE
Als Bash als een interactieve login-shell werkt, wordt eerst gekeken naar het bestand /etc/profiles met systeembrede instellingen. Om de configuratie overzichtelijk te houden, verdelen veel systemen de login- en wachtwoordinstellingen over meerdere bestanden in een subdirectory van /etc, zoals /etc/profiles.d. In Ubuntu past het bestand appsbin-path.sh daar bijvoorbeeld de PATH-variabele aan.
Bash kijkt dan vervolgens naar de bestanden in de homedirectory: eerst ~/.bash_profile, ~/.bash_ login of ~/.profile. Het geeft de voorkeur aan het bestand ~/.bash_profile. Als dat ontbreekt, wordt ./bash_login gebruikt. Als dat ook niet beschikbaar is, wordt het bestand ~/.profile gebruikt. Bij het uitloggen gebruikt bash ten slotte het bestand ~/.bash_logout. Ubuntu bewaart daar bijvoorbeeld of de inhoud van het scherm om veiligheidsredenen gewist moet worden. Op sommige systemen integreert het bestand /etc/profiles ook meteen ~/.bashrc. De instellingen daarin gelden dan ook voor een login-shell.
De standaardinstellingen in bestaande configuratiebestanden kunnen worden gebruikt als sjablonen of suggesties voor je eigen exemplaren. Je hoeft alleen de configuratiebestanden in de homedirectory te wijzigen of aan te maken. Daardoor kun je de globale standaardinstellingen desgewenst overschrijven of uitbreiden. Je moet eerst de configuratiebestanden die daar al bestaan opslaan. Je kunt ook een ander bestand (in het voorbeeld .mybashrc) toevoegen aan het einde van een bestaand configuratiebestand, dat dan je eigen instellingen bevat. Dit kan bijvoorbeeld op de volgende manier: if [ -f ~/.mybashrc ]; then
. ~/.mybashrc
fi
Alle configuratiebestanden werken volgens hetzelfde principe: Bash leest ze in en voert vervolgens alle commando’s uit die ze bevatten. Op die manier kun je niet alleen programma’s automatisch starten, maar ook omgevingsvariabelen instellen. Acties die bij het inloggen moeten worden uitgevoerd, kunnen worden opgeslagen in het bestand ~/.profile of ~/.bash_ profiel. Daar hoort bijvoorbeeld het instellen van de PATH-variabelen bij. Alle acties die uitgevoerd moeten worden wanneer een nieuwe shell wordt gestart, horen in ~/.bashrc thuis.
UITERMATE VARIABEL
Ook horen in .bashrc speciale shell- en omgevingsvariabelen te staan, die je makkelijk vergeet maar die het werk aanzienlijk verlichten. Git en andere programma’s starten in bepaalde situaties bijvoorbeeld een tekstverwerker – vaak de commandline-editor Vi. Als je liever een andere editor gebruikt, sla die dan op als EDITOR in ~/.bashrc: export EDITOR=/usr/bin/nano
De shell kan je daarbij automatisch informeren over nieuwe inkomende mail. Om dat te doen, stel je de omgevingsvariabele MAILPATH in op het bestand met je inbox. Met MAILCHECK definieer je in welke seconde- intervallen Bash je inbox moet controleren op wijzigingen. Op die manier kun je ook andere bestanden controleren, bijvoorbeeld logbestanden: MAILPATH=/home/tim/Mail/Inbox:/var/ log/MyLog.txt
MAILCHECK=5
PSEUDONIEMEN
Als je vaak wisselt tussen Windows en Linux, dan typ je al snel dir in plaats van ls in. Om de foutmelding ‘commando not found’ te voorkomen, definieer je gewoon een alias in ~/. bashrc: alias dir='ls'
Je kunt ook typfouten accepteren zoals sl in plaats van ls met alias sl='ls'. Je kunt ook van cd..
een geldig commando maken met alias cd..='cd ..'. Als je met ... twee directoryniveaus omhoog wilt springen, kan dat met alias ...='cd ../..'.
Je zou op dezelfde manier nog meer punten kunnen toevoegen, maar een notatie als alias .3='cd ../../..' is praktischer. Dan spring je met .3 drie niveaus omhoog. Met alias ll='ls | less'
blader je pagina voor pagina door de directory’s. Met het pipe-symbool kun je bijvoorbeeld de tool ps tunen. In het volgende voorbeeld zal psg automatisch de processen vinden die overeenkomen met een zoekterm: alias psg='ps -A | grep -i'
Je kunt aliassen toepassen om veelgebruikte parameters meteen te specificeren. Als je ls bijvoorbeeld altijd met ls -la aanroept, definieer dan gewoon alias ls='ls -la'. Aangezien Bash alleen de teksten vervangt, verandert het commando ls * in ls -la *. Zo’n alias overschrijft echter een ingebouwde definitie van Ubuntu, waarmee de uitvoer van ls wordt ingekleurd: ls='ls --color=auto'.
In dergelijke gevallen kun je de systeeminstelling in jouw variant opnemen of een andere afkorting gebruiken. Voor een lijst van alle bestaande definities gebruik je het commando alias.
Ook nuttig is alias wget='wget -c': dat commando gaat altijd door met downloads die met wget gestart zijn. Aliassen voor df -h, du -h en free -h
geven de respectievelijke groottes in leesbare vorm. Met een alias kun je bovendien vangnetten invoegen. De regel alias rm='rm -I' zorgt ervoor dat rm
om bevestiging vraagt voordat er meer dan drie bestanden verwijderd worden. Of je verplaatst de bestanden naar de prullenbak: alias trash='mv -t ~/.local/share/Trash'
Dat voorbeeld laat meteen ook zien hoe je lange commando’s kunt inkorten. Een klassieker op Debiansystemen is alias sai='sudo apt install'. Daardoor is in het vervolg sai pakket voldoende om pakket te installeren. De grootste directory’s kun je vinden het commando dirsize: alias dirsize="du -S | sort -n -r | less"
De volgende code zorgt ervoor dat het commando reboot automatisch overschakelt naar de sudo-versie: if [ $UID -ne 0 ]; then alias reboot='sudo reboot' fi
Sommige distributies slaan de alias-definities op in een apart bestand. Bij openSUSE is daar ~/.alias voor bedoeld, terwijl Ubuntu daarentegen ~/.bash_ aliases gebruikt.
KLEURRIJKE WERELD
Het kan ook de moeite waard zijn om de commandline-prompt aan te passen. Op die manier kun je laten aangeven of het laatste commando succesvol was. Dat is vooral nuttig als een programma geen foutmeldingen teruggeeft:
PS1="\$(if [ \$? == 0 ]; then echo OK; else echo Error ; fi) ${PS1}"
De opbouw van de prompt staat in de variabele PS1. $? bevat de exit-status van het laatste uitgevoerde commando. Als dat 0 is ging alles goed, anders is er een fout opgetreden. In het laatste geval laat de bovenstaande regel bij de prompt het woord Error zien, anders OK. Je moet de inhoud van $? zo snel mogelijk gebruiken of die in een variabele cachen, want elk volgende commando zal het onmiddellijk overschrijven.
Meer complexe prompts kun je samenstellen in een shell-functie en registreren in de variabele PROMPT_COMMANDO. De daar opgeslagen functie start Bash na elk uitgevoerd commando. De volgende code kleurt de prompt rood na een fout: myprompt() { local exit="$?" local color=""
if [ $exit != 0 ]; then color='\e[0;31m'; else
color='\e[0;32m'; fi
PS1="${color}\t \! \u@\H:\w\a\$\e[0m ";
} PROMPT_COMMAND=myprompt
Daarbij krijgt exit de inhoud van $?. Daarmee wordt in de vierde regel getest of er al eerder een fout is opgetreden. Als dat het geval is, bevat de variabele color de kleurcode voor rood, anders de kleurcode voor groen.
Daarbij is \e het teken van het begin van een zogeheten ANSI-escape-sequence. Die vertelt de terminal om de tekstopmaak te gebruiken die is gedefinieerd tussen [ en m. Het getal voor de puntkomma geeft de opmaak aan, het getal na de puntkomma geeft de kleur aan. In dit geval resulteert 4;31 in onderstreepte rode tekst en zorgt ${color} voor de kleur van de prompt. Veelgebruikte codes voor tekstopmaak staan vermeld in de tabel bij het begin van dit artikel.
De tabel op deze pagina geeft een overzicht van de sneltoetsen voor de weergave van de Bashprompt, zoals de positie van het commando in de history. Je kunt zelfs de inhoud van (omgevings)variabelen en de output van programma’s inbouwen. De prompt kan bijvoorbeeld de huidige uptime van een server weergeven:
PS1="${color}\t `uptime -p` \! \u@\H:\w\a\$\e[0m ";
Bash heeft alle voorgaande commando’s in zijn history staan. Om te voorkomen dat je later met de pijltjestoetsen lang moet scrollen, sluit je veelgebruikte commando’s zoals ls, cd en pwd zonder meer uit: HISTIGNORE="ls:cd:pwd"
SNEL TYPEN
In de configuratiebestanden definieer je je eigen toetsencombinaties met bind. Als je er veel wilt definiëren, kun je die het beste in het bestand ~/.inputrc zetten. De structuur ervan komt overeen met het globale configuratiebestand /etc/inputrc. Een sneltoets die bijvoorbeeld de hele regel verwijdert is in de dagelijkse praktijk zeer nuttig. Het volgende commando registreert daar de toetsencombinatie Ctrl+L voor: bind '"\C-l":kill-whole-line'
Daarbij staat \C voor de Ctrl-toets, na de dubbele punt wordt het gewenste bewerkingscommando van de C-functie readline gespecificeerd. In dit voorbeeld verwijdert de functie kill-whole-line een hele regel. Een lijst met alle functies krijg je met
man readline. Andere nuttige definities van sneltoetsen zijn
bind '"\e[15~":"xdg-open . \n"' bind '"\e[16~":"cd - \n"'
Door het eerste commando start F5 de bestandsbeheerder met de inhoud van de huidige map, door het tweede commando schakelt F6 over naar de eerder bezochte map. Om het nummer te vinden dat overeenkomt met de F-toets, typ je read in, druk je op Enter en vervolgens op de betreffende F-toets.
Houd er rekening mee dat de desktop de F-toets dan al afgevangen kan hebben.
FUNCTIONEEL
Met zelfgedefinieerde shellfuncties in ~/.bashrc vereenvoudig je terugkerende taken. Het commando cdl gaat bijvoorbeeld naar een directory en laat meteen de inhoud ervan zien: cdl() {
cd "$@" if [ "$?" == 0 ]; then ls fi }
De volgende shellfunctie backup kopieert een bestand en voegt automatisch .backup- en de huidige datum toe aan de bestandsnaam: backup() { cp "$@" "$@".backup-`date +%Y%m%d`; }
Als je vaak archieven moet uitpakken, hoef je de verschillende parameters van tar of unzip niet te onthouden dankzij extract: extract () {
case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.zip) unzip $1 ;;
*) echo "Unbekanntes
Format" ;; esac }
Je kunt je die definitie besparen als er universele uitpakprogramma’s zoals unp of atools geïnstalleerd zijn. Je kunt je eigen extract echter op (bijna) alle systemen gebruiken.
MEER EN MEER
Wat er precies nuttig is in configuratiebestanden zoals ~/.bashrc hangt sterk af van je eigen wensen. De hier gesuggereerde commando’s kunnen daarom alleen dienen als een suggestie. Eén ding is echter zeker: persoonlijke afkortingen en functies kunnen het werken op de commandline veel makkelijker maken.
Houd er echter rekening mee dat je eigen creaties niet beschikbaar zijn op andere systemen. Een snel uit gewoonte ingetypte fai leidt dan tot een foutmelding. Gelukkig is het bestand ~/.bashrc makkelijk mee te nemen naar andere Linux-systemen – zolang er geen al te exotische commando’s in zitten.