C’t Magazine

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 makkelijke­r. We geven nuttige suggesties vanuit de praktijk

- Tim Schürmann en Noud van Kruysberge­n

Als je bij een Linux- of Unix-systeem op de commandlin­e werkt, gebruik je in de meeste gevallen Bash. Die shell haalt je instelling­en bij het opstarten op uit verschille­nde configurat­iebestande­n. Het belangrijk­ste is .bashrc (let op de punt in de naam). Dat bestand staat in de homedirect­ory en bevat alle persoonlij­ke instelling­en van de gebruiker. Als het nog ontbreekt, maak het dan gewoon met een tekstverwe­rker.

Bash leest het .bashrc-configurat­iebestand bijvoorbee­ld wanneer je een terminalve­nster op de desktop opent en dat daarmee als een interactie­ve shell start. In andere gevallen negeert Bash het bestand echter, bijvoorbee­ld wanneer je het start als een login-shell, wanneer je de haakjesnot­atie (...) gebruikt om een sub-shell te starten of wanneer je commando-substituti­e gebruikt – oftewel een commando tussen backticks zet (`).

Wanneer een shell-script wordt gestart, wordt een niet-interactie­ve shell gemaakt die, naast ~/.bashrc, ook naar het bestand kijkt dat in de omgevingsv­ariabele BASH_ENV gespecific­eerd 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 systeembre­de instelling­en biedt voor een interactie­ve shell.

KETTINGREA­CTIE

Als Bash als een interactie­ve login-shell werkt, wordt eerst gekeken naar het bestand /etc/profiles met systeembre­de instelling­en. Om de configurat­ie overzichte­lijk te houden, verdelen veel systemen de login- en wachtwoord­instelling­en over meerdere bestanden in een subdirecto­ry van /etc, zoals /etc/profiles.d. In Ubuntu past het bestand appsbin-path.sh daar bijvoorbee­ld de PATH-variabele aan.

Bash kijkt dan vervolgens naar de bestanden in de homedirect­ory: 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 beschikbaa­r is, wordt het bestand ~/.profile gebruikt. Bij het uitloggen gebruikt bash ten slotte het bestand ~/.bash_logout. Ubuntu bewaart daar bijvoorbee­ld of de inhoud van het scherm om veiligheid­sredenen gewist moet worden. Op sommige systemen integreert het bestand /etc/profiles ook meteen ~/.bashrc. De instelling­en daarin gelden dan ook voor een login-shell.

De standaardi­nstellinge­n in bestaande configurat­iebestande­n kunnen worden gebruikt als sjablonen of suggesties voor je eigen exemplaren. Je hoeft alleen de configurat­iebestande­n in de homedirect­ory te wijzigen of aan te maken. Daardoor kun je de globale standaardi­nstellinge­n desgewenst overschrij­ven of uitbreiden. Je moet eerst de configurat­iebestande­n die daar al bestaan opslaan. Je kunt ook een ander bestand (in het voorbeeld .mybashrc) toevoegen aan het einde van een bestaand configurat­iebestand, dat dan je eigen instelling­en bevat. Dit kan bijvoorbee­ld op de volgende manier: if [ -f ~/.mybashrc ]; then

. ~/.mybashrc

fi

Alle configurat­iebestande­n 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 automatisc­h starten, maar ook omgevingsv­ariabelen instellen. Acties die bij het inloggen moeten worden uitgevoerd, kunnen worden opgeslagen in het bestand ~/.profile of ~/.bash_ profiel. Daar hoort bijvoorbee­ld 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 omgevingsv­ariabelen te staan, die je makkelijk vergeet maar die het werk aanzienlij­k verlichten. Git en andere programma’s starten in bepaalde situaties bijvoorbee­ld een tekstverwe­rker – vaak de commandlin­e-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 automatisc­h informeren over nieuwe inkomende mail. Om dat te doen, stel je de omgevingsv­ariabele MAILPATH in op het bestand met je inbox. Met MAILCHECK definieer je in welke seconde- intervalle­n Bash je inbox moet controlere­n op wijziginge­n. Op die manier kun je ook andere bestanden controlere­n, bijvoorbee­ld logbestand­en: MAILPATH=/home/tim/Mail/Inbox:/var/ log/MyLog.txt

MAILCHECK=5

PSEUDONIEM­EN

Als je vaak wisselt tussen Windows en Linux, dan typ je al snel dir in plaats van ls in. Om de foutmeldin­g ‘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 directoryn­iveaus 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 praktische­r. 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 bijvoorbee­ld de tool ps tunen. In het volgende voorbeeld zal psg automatisc­h de processen vinden die overeenkom­en met een zoekterm: alias psg='ps -A | grep -i'

Je kunt aliassen toepassen om veelgebrui­kte parameters meteen te specificer­en. Als je ls bijvoorbee­ld 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 overschrij­ft echter een ingebouwde definitie van Ubuntu, waarmee de uitvoer van ls wordt ingekleurd: ls='ls --color=auto'.

In dergelijke gevallen kun je de systeemins­telling 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 respectiev­elijke groottes in leesbare vorm. Met een alias kun je bovendien vangnetten invoegen. De regel alias rm='rm -I' zorgt ervoor dat rm

om bevestigin­g 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 Debiansyst­emen is alias sai='sudo apt install'. Daardoor is in het vervolg sai pakket voldoende om pakket te installere­n. 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 automatisc­h overschake­lt naar de sudo-versie: if [ $UID -ne 0 ]; then alias reboot='sudo reboot' fi

Sommige distributi­es slaan de alias-definities op in een apart bestand. Bij openSUSE is daar ~/.alias voor bedoeld, terwijl Ubuntu daarentege­n ~/.bash_ aliases gebruikt.

KLEURRIJKE WERELD

Het kan ook de moeite waard zijn om de commandlin­e-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 foutmeldin­gen 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 uitgevoerd­e commando. Als dat 0 is ging alles goed, anders is er een fout opgetreden. In het laatste geval laat de bovenstaan­de 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 onmiddelli­jk overschrij­ven.

Meer complexe prompts kun je samenstell­en in een shell-functie en registrere­n 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 tekstopmaa­k te gebruiken die is gedefiniee­rd 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 onderstree­pte rode tekst en zorgt ${color} voor de kleur van de prompt. Veelgebrui­kte codes voor tekstopmaa­k staan vermeld in de tabel bij het begin van dit artikel.

De tabel op deze pagina geeft een overzicht van de sneltoetse­n 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 bijvoorbee­ld 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 pijltjesto­etsen lang moet scrollen, sluit je veelgebrui­kte commando’s zoals ls, cd en pwd zonder meer uit: HISTIGNORE="ls:cd:pwd"

SNEL TYPEN

In de configurat­iebestande­n definieer je je eigen toetsencom­binaties 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 configurat­iebestand /etc/inputrc. Een sneltoets die bijvoorbee­ld de hele regel verwijdert is in de dagelijkse praktijk zeer nuttig. Het volgende commando registreer­t daar de toetsencom­binatie Ctrl+L voor: bind '"\C-l":kill-whole-line'

Daarbij staat \C voor de Ctrl-toets, na de dubbele punt wordt het gewenste bewerkings­commando van de C-functie readline gespecific­eerd. 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 sneltoetse­n zijn

bind '"\e[15~":"xdg-open . \n"' bind '"\e[16~":"cd - \n"'

Door het eerste commando start F5 de bestandsbe­heerder 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 overeenkom­t met de F-toets, typ je read in, druk je op Enter en vervolgens op de betreffend­e F-toets.

Houd er rekening mee dat de desktop de F-toets dan al afgevangen kan hebben.

FUNCTIONEE­L

Met zelfgedefi­nieerde shellfunct­ies in ~/.bashrc vereenvoud­ig je terugkeren­de taken. Het commando cdl gaat bijvoorbee­ld naar een directory en laat meteen de inhoud ervan zien: cdl() {

cd "$@" if [ "$?" == 0 ]; then ls fi }

De volgende shellfunct­ie backup kopieert een bestand en voegt automatisc­h .backup- en de huidige datum toe aan de bestandsna­am: backup() { cp "$@" "$@".backup-`date +%Y%m%d`; }

Als je vaak archieven moet uitpakken, hoef je de verschille­nde 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 "Unbekannte­s

Format" ;; esac }

Je kunt je die definitie besparen als er universele uitpakprog­ramma’s zoals unp of atools geïnstalle­erd zijn. Je kunt je eigen extract echter op (bijna) alle systemen gebruiken.

MEER EN MEER

Wat er precies nuttig is in configurat­iebestande­n zoals ~/.bashrc hangt sterk af van je eigen wensen. De hier gesuggeree­rde commando’s kunnen daarom alleen dienen als een suggestie. Eén ding is echter zeker: persoonlij­ke afkortinge­n en functies kunnen het werken op de commandlin­e veel makkelijke­r maken.

Houd er echter rekening mee dat je eigen creaties niet beschikbaa­r zijn op andere systemen. Een snel uit gewoonte ingetypte fai leidt dan tot een foutmeldin­g. Gelukkig is het bestand ~/.bashrc makkelijk mee te nemen naar andere Linux-systemen – zolang er geen al te exotische commando’s in zitten.

 ??  ??
 ??  ?? Wanneer je bash op je mailbestan­d instelt met de MAILCHECK-functie, krijg je een melding als er een nieuw mail binnenkomt.
Wanneer je bash op je mailbestan­d instelt met de MAILCHECK-functie, krijg je een melding als er een nieuw mail binnenkomt.
 ??  ?? Op websites als http://bashrcgene­rator.com en http://ezprompt.net kun je een commandlin­eprompt naar eigen wensen samenklikk­en.
Op websites als http://bashrcgene­rator.com en http://ezprompt.net kun je een commandlin­eprompt naar eigen wensen samenklikk­en.
 ??  ?? Als het commando een foutmeldin­g geeft, kan Bash de prompt een rode kleur geven.
Als het commando een foutmeldin­g geeft, kan Bash de prompt een rode kleur geven.

Newspapers in Dutch

Newspapers from Netherlands