Tips en Trucs 2018

Bash Tips

De Bash shell is een fundamenteel stuk gereedschap en elke Linux gebruiker kan er zijn voordeel uit halen.

Welke shell gebruik je?

Om te weten welke shells op uw systeem aanwezig zijn, bekijk je de inhoud van het /etc/shells bestand:

dany@pindabook:~> cat /etc/shells
/bin/ash
/bin/bash
...
/bin/tcsh
/bin/true
/bin/zsh
/usr/bin/csh
/usr/bin/dash
...
/usr/bin/bash
/usr/bin/tcsh
/usr/bin/zsh

Uw standaard shell is ingesteld in het /etc/passwd configuratiebestand. De door gebruiker dany gebruikte standaard shell vraag je op met de volgende zoekopdracht:

dany@pindabook:~> cat /etc/passwd | grep dany
dany:x:1000:100:Dany Pinoy:/home/dany:/bin/bash

Met de exit opdracht sluit je een shell af:

/home/dany> exit
exit
dany@pindabook:~>

Wat bevat Bash?

Met de volgende opdracht krijg je een overzicht van alle in Bash ingebouwde opdrachten:

dany@pindabook:~> enable -a
enable .
enable :
enable [
enable alias
enable bg
...
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait

Sommige opdrachten zijn ook beschikbaar buiten Bash (printf, kill, echo). De Bash versies zijn vereenvoudigde versies met minder opties. Om de verschillende versies van een opdracht op te vragen, gebruik je de type opdracht:

dany@pindabook:~> type -a printf
printf is een ingebouwde shell-functie
printf is /usr/bin/printf
printf is /usr/bin/X11/printf

Bash neemt de ingebouwde opdrachten voor, om de externe opdracht gebruiken, start je deze door het pad op te geven:

dany@pindabook:~> NAAM="Pinoy"
dany@pindabook:~> VOORNAAM="Dany"
dany@pindabook:~> /usr/bin/printf "Voornaam: %s\nNaam: %s\n" "$VOORNAAM" "$NAAM"
Voornaam: Dany
Naam: Pinoy

Om de help van een ingebouwde opdracht op te vragen, gebruik je de help opdracht help printf

Bash help

Bash configuratiebestanden

Er zijn verschillende Bash configuratiebestanden en het gebruik ervan hangt af van uw distributie. De beste manier om ze te leren kennen is ze lezen. Gebruiker specifieke configuratie bestanden in de thuismap hebben voorrang op de systeem configuratiebestanden in de etc map:

De grootte van de opdrachtengeschiedenis achterhaal je met de opdracht:

dany@main:~> echo $HISTFILESIZE
1000

Shell expansie

Als je een tilde (~) ziet in een pad, wordt deze door de shell vervangen door de thuismap (bijvoorbeeld: /home/dany). De shell expandeert de tilde naar de thuismap.

dany@main:~> ls ~/.bashrc
/home/dany/.bashrc

De inhoud tussen accolades expanderen naar tekst. Let echter op met spaties. Om een groep mappen in één keer aan te maken, gebruik je:

dany@main:~> mkdir -p testmappen/{test4,teste,test6,test12}

Patroonovereenkomsten (pattern matching) gebruikt *, ? en []. Een * betekent elke tekst, bekend van *.jpg om alle JPG bestanden op te zoeken. test* zoekt alle bestanden die beginnen met test.

dany@main:~> ls testmappen/test*
testmappen/test12:

testmappen/test4:

testmappen/test6:

testmappen/teste:

Een ? stelt één willekeurig teken voor:

dany@main:~> ls testmappen/test?
testmappen/test4:

testmappen/test6:

testmappen/teste:

Patronen tussen rechte haken stellen één teken voor en deze moet overeenstemmen met een teken opgeven tussen de haken:

dany@main:~> ls testmappen/test[46]
testmappen/test4:

testmappen/test6:

Bovendien ondersteunt de expansie van rechte haken de POSIX karakter klassen: alnum, alfa, ascii, blank, cntrl, digit, graph, lower, print, punct, space, upper, word en xdigit. Om één cijfer voor te stellen gebruik je digit:

dany@main:~> ls testmappen/test[[:digit:]]
testmappen/test4:

testmappen/test6:

Om één letter of cijfer voor te stellen gebruik je alnum:

dany@main:~> ls testmappen/test[[:alnum:]]
testmappen/test4:

testmappen/test6:

testmappen/teste:

Opdrachtsubstitutie

Opdrachtsubstitutie vervangt opdrachten door hun uitvoer:

dany@main:~> echo "Ik werk in de map $(pwd), op $(date) en werk op de computer met de naam $(hostname)"
Ik werk in de map /home/dany, op za jan 27 14:19:55 CET 2018 en werk op de computer met de naam main

Je kunt elke opdracht of script gebruiken, en zelfs opdrachten combineren:

dany@main:~> echo "De gebruikersnamen in het /etc/passwd bestand zijn $(awk -F":" '{ print $1 }' /etc/passwd)"
De gebruikersnamen in het /etc/passwd bestand zijn at
avahi
...
dany

Zo kan je de uitvoer van een opdracht ook opslaan in variabelen en later gebruiken.

dany@main:~> CWD=$(pwd)
dany@main:~> DATE=$(date)
dany@main:~> HOSTNAME=$(hostname)
dany@main:~> echo "Ik werk in de map $CWD, op $DATE en werk op de computer met de naam $HOSTNAME"
Ik werk in de map /home/dany, op za jan 27 14:28:07 CET 2018 en werk op de computer met de naam main

En verder

We sluiten af met wat koppelingen naar Bash tutorials: