Li­nux-shell bash in­stel­len en van kleur voor­zien

Min­der ty­pen en snel­ler wer­ken: pas de Li­nux-shell Bash aan jouw spe­ci­fie­ke be­hoef­ten aan. Ei­gen func­ties ma­ken je werk veel mak­ke­lij­ker. We ge­ven nut­ti­ge sug­ges­ties van­uit de prak­tijk

C’t Magazine - - Inhoud - Tim Sch­ür­mann en Noud van Kruys­ber­gen

Als je bij een Li­nux- of Unix-sys­teem op de com­mand­line werkt, ge­bruik je in de mees­te ge­val­len Bash. Die shell haalt je in­stel­lin­gen bij het op­star­ten op uit ver­schil­len­de con­fi­gu­ra­tie­be­stan­den. Het be­lang­rijk­ste is .bashrc (let op de punt in de naam). Dat be­stand staat in de ho­me­di­rec­to­ry en be­vat al­le per­soon­lij­ke in­stel­lin­gen van de ge­brui­ker. Als het nog ont­breekt, maak het dan ge­woon met een tekst­ver­wer­ker.

Bash leest het .bashrc-con­fi­gu­ra­tie­be­stand bij­voor­beeld wan­neer je een ter­mi­nal­ven­ster op de desktop opent en dat daar­mee als een in­ter­ac­tie­ve shell start. In an­de­re ge­val­len ne­geert Bash het be­stand ech­ter, bij­voor­beeld wan­neer je het start als een lo­gin-shell, wan­neer je de haak­jes­no­ta­tie (...) ge­bruikt om een sub-shell te star­ten of wan­neer je com­man­do-sub­sti­tu­tie ge­bruikt – of­te­wel een com­man­do tus­sen back­ticks zet (`).

Wan­neer een shell-script wordt ge­start, wordt een niet-in­ter­ac­tie­ve shell ge­maakt die, naast ~/.bashrc, ook naar het be­stand kijkt dat in de om­ge­vings­va­ri­a­be­le BASH_ENV ge­spe­ci­fi­ceerd is. Op de mees­te sys­te­men is BASH_ENV ech­ter niet in­ge­steld en dan blijft al­leen ~/.bashrc over. Ubuntu ge­bruikt ook het be­stand /etc/bash.bashrc, dat sys­teem­bre­de in­stel­lin­gen biedt voor een in­ter­ac­tie­ve shell.

KETTINGREA­CTIE

Als Bash als een in­ter­ac­tie­ve lo­gin-shell werkt, wordt eerst ge­ke­ken naar het be­stand /etc/pro­fi­les met sys­teem­bre­de in­stel­lin­gen. Om de con­fi­gu­ra­tie over­zich­te­lijk te hou­den, ver­de­len veel sys­te­men de lo­gin- en wacht­woord­in­stel­lin­gen over meer­de­re be­stan­den in een sub­di­rec­to­ry van /etc, zo­als /etc/pro­fi­les.d. In Ubuntu past het be­stand apps­bin-path.sh daar bij­voor­beeld de PATH-va­ri­a­be­le aan.

Bash kijkt dan ver­vol­gens naar de be­stan­den in de ho­me­di­rec­to­ry: eerst ~/.bas­h_­pro­fi­le, ~/.bas­h_ lo­gin of ~/.pro­fi­le. Het geeft de voor­keur aan het be­stand ~/.bas­h_­pro­fi­le. Als dat ont­breekt, wordt ./bas­h_lo­gin ge­bruikt. Als dat ook niet be­schik­baar is, wordt het be­stand ~/.pro­fi­le ge­bruikt. Bij het uit­log­gen ge­bruikt bash ten slot­te het be­stand ~/.bas­h_lo­gout. Ubuntu be­waart daar bij­voor­beeld of de in­houd van het scherm om vei­lig­heids­re­de­nen ge­wist moet wor­den. Op som­mi­ge sys­te­men in­te­greert het be­stand /etc/pro­fi­les ook met­een ~/.bashrc. De in­stel­lin­gen daar­in gel­den dan ook voor een lo­gin-shell.

De stan­daard­in­stel­lin­gen in be­staan­de con­fi­gu­ra­tie­be­stan­den kun­nen wor­den ge­bruikt als sja­blo­nen of sug­ges­ties voor je ei­gen exem­pla­ren. Je hoeft al­leen de con­fi­gu­ra­tie­be­stan­den in de ho­me­di­rec­to­ry te wij­zi­gen of aan te ma­ken. Daar­door kun je de glo­ba­le stan­daard­in­stel­lin­gen des­ge­wenst over­schrij­ven of uit­brei­den. Je moet eerst de con­fi­gu­ra­tie­be­stan­den die daar al be­staan op­slaan. Je kunt ook een an­der be­stand (in het voor­beeld .my­bashrc) toe­voe­gen aan het ein­de van een be­staand con­fi­gu­ra­tie­be­stand, dat dan je ei­gen in­stel­lin­gen be­vat. Dit kan bij­voor­beeld op de vol­gen­de ma­nier: if [ -f ~/.my­bashrc ]; then

. ~/.my­bashrc

fi

Al­le con­fi­gu­ra­tie­be­stan­den wer­ken vol­gens het­zelf­de prin­ci­pe: Bash leest ze in en voert ver­vol­gens al­le com­man­do’s uit die ze be­vat­ten. Op die ma­nier kun je niet al­leen pro­gram­ma’s au­to­ma­tisch star­ten, maar ook om­ge­vings­va­ri­a­be­len in­stel­len. Ac­ties die bij het in­log­gen moe­ten wor­den uit­ge­voerd, kun­nen wor­den op­ge­sla­gen in het be­stand ~/.pro­fi­le of ~/.bas­h_ pro­fiel. Daar hoort bij­voor­beeld het in­stel­len van de PATH-va­ri­a­be­len bij. Al­le ac­ties die uit­ge­voerd moe­ten wor­den wan­neer een nieu­we shell wordt ge­start, ho­ren in ~/.bashrc thuis.

UITERMATE VARIABEL

Ook ho­ren in .bashrc spe­ci­a­le shell- en om­ge­vings­va­ri­a­be­len te staan, die je mak­ke­lijk ver­geet maar die het werk aan­zien­lijk ver­lich­ten. Git en an­de­re pro­gram­ma’s star­ten in be­paal­de si­tu­a­ties bij­voor­beeld een tekst­ver­wer­ker – vaak de com­mand­line-edi­tor Vi. Als je lie­ver een an­de­re edi­tor ge­bruikt, sla die dan op als EDI­TOR in ~/.bashrc: ex­port EDI­TOR=/usr/bin/na­no

De shell kan je daar­bij au­to­ma­tisch in­for­me­ren over nieu­we in­ko­men­de mail. Om dat te doen, stel je de om­ge­vings­va­ri­a­be­le MAILPATH in op het be­stand met je in­box. Met MAILCHECK de­fi­ni­eer je in wel­ke se­con­de- in­ter­val­len Bash je in­box moet con­tro­le­ren op wij­zi­gin­gen. Op die ma­nier kun je ook an­de­re be­stan­den con­tro­le­ren, bij­voor­beeld log­be­stan­den: MAILPATH=/ho­me/tim/Mail/In­box:/var/ log/MyLog.txt

MAILCHECK=5

PSEUDONIEM­EN

Als je vaak wis­selt tus­sen Windows en Li­nux, dan typ je al snel dir in plaats van ls in. Om de fout­mel­ding ‘com­man­do not found’ te voor­ko­men, de­fi­ni­eer je ge­woon een ali­as in ~/. bashrc: ali­as dir='ls'

Je kunt ook typ­fou­ten ac­cep­te­ren zo­als sl in plaats van ls met ali­as sl='ls'. Je kunt ook van cd..

een gel­dig com­man­do ma­ken met ali­as cd..='cd ..'. Als je met ... twee di­rec­to­ry­ni­veaus om­hoog wilt sprin­gen, kan dat met ali­as ...='cd ../..'.

Je zou op de­zelf­de ma­nier nog meer pun­ten kun­nen toe­voe­gen, maar een no­ta­tie als ali­as .3='cd ../../..' is prak­ti­scher. Dan spring je met .3 drie ni­veaus om­hoog. Met ali­as ll='ls | less'

bla­der je pa­gi­na voor pa­gi­na door de di­rec­to­ry’s. Met het pi­pe-sym­bool kun je bij­voor­beeld de tool ps tu­nen. In het vol­gen­de voor­beeld zal psg au­to­ma­tisch de pro­ces­sen vin­den die over­een­ko­men met een zoek­term: ali­as psg='ps -A | grep -i'

Je kunt ali­as­sen toe­pas­sen om veel­ge­bruik­te pa­ra­me­ters met­een te spe­ci­fi­ce­ren. Als je ls bij­voor­beeld al­tijd met ls -la aan­roept, de­fi­ni­eer dan ge­woon ali­as ls='ls -la'. Aan­ge­zien Bash al­leen de tek­sten ver­vangt, ver­an­dert het com­man­do ls * in ls -la *. Zo’n ali­as over­schrijft ech­ter een in­ge­bouw­de de­fi­ni­tie van Ubuntu, waar­mee de uit­voer van ls wordt in­ge­kleurd: ls='ls --co­lor=au­to'.

In der­ge­lij­ke ge­val­len kun je de sys­teem­in­stel­ling in jouw va­ri­ant op­ne­men of een an­de­re af­kor­ting ge­brui­ken. Voor een lijst van al­le be­staan­de de­fi­ni­ties ge­bruik je het com­man­do ali­as.

Ook nut­tig is ali­as wget='wget -c': dat com­man­do gaat al­tijd door met down­lo­ads die met wget ge­start zijn. Ali­as­sen voor df -h, du -h en free -h

ge­ven de res­pec­tie­ve­lij­ke groot­tes in lees­ba­re vorm. Met een ali­as kun je bo­ven­dien vang­net­ten in­voe­gen. De re­gel ali­as rm='rm -I' zorgt er­voor dat rm

om be­ves­ti­ging vraagt voor­dat er meer dan drie be­stan­den ver­wij­derd wor­den. Of je ver­plaatst de be­stan­den naar de prul­len­bak: ali­as trash='mv -t ~/.lo­cal/sha­re/Trash'

Dat voor­beeld laat met­een ook zien hoe je lan­ge com­man­do’s kunt in­kor­ten. Een klas­sie­ker op De­bian­sys­te­men is ali­as sai='su­do apt in­stall'. Daar­door is in het ver­volg sai pak­ket vol­doen­de om pak­ket te in­stal­le­ren. De groot­ste di­rec­to­ry’s kun je vin­den het com­man­do dir­si­ze: ali­as dir­si­ze="du -S | sort -n -r | less"

De vol­gen­de co­de zorgt er­voor dat het com­man­do re­boot au­to­ma­tisch over­scha­kelt naar de su­do-ver­sie: if [ $UID -ne 0 ]; then ali­as re­boot='su­do re­boot' fi

Som­mi­ge dis­tri­bu­ties slaan de ali­as-de­fi­ni­ties op in een apart be­stand. Bij openSUSE is daar ~/.ali­as voor be­doeld, ter­wijl Ubuntu daar­en­te­gen ~/.bas­h_ alia­ses ge­bruikt.

KLEUR­RIJ­KE WE­RELD

Het kan ook de moei­te waard zijn om de com­mand­line-prompt aan te pas­sen. Op die ma­nier kun je la­ten aan­ge­ven of het laat­ste com­man­do suc­ces­vol was. Dat is voor­al nut­tig als een pro­gram­ma geen fout­mel­din­gen te­rug­geeft:

PS1="\$(if [ \$? == 0 ]; then echo OK; el­se echo Er­ror ; fi) ${PS1}"

De op­bouw van de prompt staat in de va­ri­a­be­le PS1. $? be­vat de exit-sta­tus van het laat­ste uit­ge­voer­de com­man­do. Als dat 0 is ging al­les goed, an­ders is er een fout op­ge­tre­den. In het laat­ste ge­val laat de bo­ven­staan­de re­gel bij de prompt het woord Er­ror zien, an­ders OK. Je moet de in­houd van $? zo snel mo­ge­lijk ge­brui­ken of die in een va­ri­a­be­le ca­chen, want elk vol­gen­de com­man­do zal het on­mid­del­lijk over­schrij­ven.

Meer com­plexe prompts kun je sa­men­stel­len in een shell-func­tie en re­gi­stre­ren in de va­ri­a­be­le PROMPT_COMMANDO. De daar op­ge­sla­gen func­tie start Bash na elk uit­ge­voerd com­man­do. De vol­gen­de co­de kleurt de prompt rood na een fout: my­prompt() { lo­cal exit="$?" lo­cal co­lor=""

if [ $exit != 0 ]; then co­lor='\e[0;31m'; el­se

co­lor='\e[0;32m'; fi

PS1="${co­lor}\t \! \u@\H:\w\a\$\e[0m ";

} PROMPT_COMMAND=my­prompt

Daar­bij krijgt exit de in­houd van $?. Daar­mee wordt in de vier­de re­gel ge­test of er al eer­der een fout is op­ge­tre­den. Als dat het ge­val is, be­vat de va­ri­a­be­le co­lor de kleur­co­de voor rood, an­ders de kleur­co­de voor groen.

Daar­bij is \e het te­ken van het be­gin van een zo­ge­he­ten ANSI-es­ca­pe-se­quen­ce. Die ver­telt de ter­mi­nal om de tekstop­maak te ge­brui­ken die is ge­de­fi­ni­eerd tus­sen [ en m. Het ge­tal voor de punt­kom­ma geeft de op­maak aan, het ge­tal na de punt­kom­ma geeft de kleur aan. In dit ge­val re­sul­teert 4;31 in on­der­streep­te ro­de tekst en zorgt ${co­lor} voor de kleur van de prompt. Veel­ge­bruik­te co­des voor tekstop­maak staan ver­meld in de ta­bel bij het be­gin van dit ar­ti­kel.

De ta­bel op de­ze pa­gi­na geeft een over­zicht van de snel­toet­sen voor de weer­ga­ve van de Bash­prompt, zo­als de positie van het com­man­do in de his­to­ry. Je kunt zelfs de in­houd van (om­ge­vings)va­ri­a­be­len en de out­put van pro­gram­ma’s in­bou­wen. De prompt kan bij­voor­beeld de hui­di­ge up­ti­me van een ser­ver weer­ge­ven:

PS1="${co­lor}\t `up­ti­me -p` \! \u@\H:\w\a\$\e[0m ";

Bash heeft al­le voor­gaan­de com­man­do’s in zijn his­to­ry staan. Om te voor­ko­men dat je la­ter met de pijl­tjes­toet­sen lang moet scrol­len, sluit je veel­ge­bruik­te com­man­do’s zo­als ls, cd en pwd zon­der meer uit: HISTIGNORE="ls:cd:pwd"

SNEL TY­PEN

In de con­fi­gu­ra­tie­be­stan­den de­fi­ni­eer je je ei­gen toet­sen­com­bi­na­ties met bind. Als je er veel wilt de­fi­ni­ë­ren, kun je die het bes­te in het be­stand ~/.in­put­rc zet­ten. De struc­tuur er­van komt over­een met het glo­ba­le con­fi­gu­ra­tie­be­stand /etc/in­put­rc. Een snel­toets die bij­voor­beeld de he­le re­gel ver­wij­dert is in de da­ge­lijk­se prak­tijk zeer nut­tig. Het vol­gen­de com­man­do re­gi­streert daar de toet­sen­com­bi­na­tie Ctrl+L voor: bind '"\C-l":kill-who­le-li­ne'

Daar­bij staat \C voor de Ctrl-toets, na de dub­be­le punt wordt het ge­wens­te be­wer­kings­com­man­do van de C-func­tie read­line ge­spe­ci­fi­ceerd. In dit voor­beeld ver­wij­dert de func­tie kill-who­le-li­ne een he­le re­gel. Een lijst met al­le func­ties krijg je met

man read­line. An­de­re nut­ti­ge de­fi­ni­ties van snel­toet­sen zijn

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

Door het eer­ste com­man­do start F5 de be­stands­be­heer­der met de in­houd van de hui­di­ge map, door het twee­de com­man­do scha­kelt F6 over naar de eer­der be­zoch­te map. Om het num­mer te vin­den dat over­een­komt met de F-toets, typ je read in, druk je op En­ter en ver­vol­gens op de be­tref­fen­de F-toets.

Houd er re­ke­ning mee dat de desktop de F-toets dan al af­ge­van­gen kan heb­ben.

FUNCTIONEE­L

Met zelf­ge­de­fi­ni­eer­de shel­l­func­ties in ~/.bashrc ver­een­vou­dig je te­rug­ke­ren­de ta­ken. Het com­man­do cdl gaat bij­voor­beeld naar een di­rec­to­ry en laat met­een de in­houd er­van zien: cdl() {

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

De vol­gen­de shel­l­func­tie bac­kup ko­pi­eert een be­stand en voegt au­to­ma­tisch .bac­kup- en de hui­di­ge da­tum toe aan de be­stands­naam: bac­kup() { cp "$@" "$@".bac­kup-`da­te +%Y%m%d`; }

Als je vaak ar­chie­ven moet uit­pak­ken, hoef je de ver­schil­len­de pa­ra­me­ters van tar of un­zip niet te ont­hou­den dank­zij ex­tract: ex­tract () {

ca­se $1 in *.tar.bz2) tar xv­jf $1 ;; *.tar.gz) tar xvzf $1 ;; *.zip) un­zip $1 ;;

*) echo "Un­be­kan­n­tes

For­mat" ;; esac }

Je kunt je die de­fi­ni­tie be­spa­ren als er uni­ver­se­le uit­pak­pro­gram­ma’s zo­als unp of atools ge­ïn­stal­leerd zijn. Je kunt je ei­gen ex­tract ech­ter op (bij­na) al­le sys­te­men ge­brui­ken.

MEER EN MEER

Wat er pre­cies nut­tig is in con­fi­gu­ra­tie­be­stan­den zo­als ~/.bashrc hangt sterk af van je ei­gen wen­sen. De hier ge­sug­ge­reer­de com­man­do’s kun­nen daar­om al­leen die­nen als een sug­ges­tie. Eén ding is ech­ter ze­ker: per­soon­lij­ke af­kor­tin­gen en func­ties kun­nen het wer­ken op de com­mand­line veel mak­ke­lij­ker ma­ken.

Houd er ech­ter re­ke­ning mee dat je ei­gen cre­a­ties niet be­schik­baar zijn op an­de­re sys­te­men. Een snel uit ge­woon­te in­ge­typ­te fai leidt dan tot een fout­mel­ding. Ge­luk­kig is het be­stand ~/.bashrc mak­ke­lijk mee te ne­men naar an­de­re Li­nux-sys­te­men – zo­lang er geen al te exo­ti­sche com­man­do’s in zit­ten.

Wan­neer je bash op je mail­be­stand in­stelt met de MAILCHECK-func­tie, krijg je een mel­ding als er een nieuw mail bin­nen­komt.

Op web­si­tes als http://bashr­c­ge­ne­ra­tor.com en http://ez­prompt.net kun je een com­mand­line­prompt naar ei­gen wen­sen sa­men­klik­ken.

Als het com­man­do een fout­mel­ding geeft, kan Bash de prompt een ro­de kleur ge­ven.

Newspapers in Dutch

Newspapers from Netherlands

© PressReader. All rights reserved.