Tips en Trucs 2026

Bash functies beheren met declare

In Fish shell is er een speciale opdracht, namelijk functions, om functies te beheren. Maar er is geen ingebouwde opdracht die precies hetzelfde doet als de Fish shell-opdracht functions voor het beheren van functies in Bash. Bash biedt echter andere hulpmiddelen en technieken om een vergelijkbare functionaliteit te bereiken.

We kunnen functies direct in het ~/.bashrc-bestand maken of definiëren, of we kunnen de functies opslaan in aparte bestanden in een speciale map, bijvoorbeeld ~/.bash_functions.

Het opslaan van alle functies in een enkele map maakt het mogelijk om je functies georganiseerd en gemakkelijk te beheren.

We maken dus eerst een speciale map aan om alle functies in op te slaan:

dany@pindabook:~$ mkdir ~/.bash_functions

En slaan voortaan elke functie op in een afzonderlijk bestand in de map ~/.bash_functions/.

Laten we een voorbeeld functie maken genaamd cdls.

dany@pindabook:~$ nano ~/.bash_functions/cdls.sh

Voeg de volgende opdrachtregels toe:

cdls ()
{
   cd "$@" && ls --color=auto
}

Sla de functie op met de sneltoets Ctrl+s en sluit nano af met Ctrl+x.

Om de zelf geschreven functies automatisch te activeren bij het opstarten van Bash, passen we het Bash opstartscript aan:

dany@pindabook:~$ nano .bashrc

En voegen helemaal achteraan de volgende opdrachtregels toe:

for func_file in ~/.bash_functions/*.sh; do
   source "$func_file"
done

Sla de aanpassing op met de sneltoets Ctrl+s en sluit nano af met Ctrl+x. Herstart de Bash terminal om de aanpassing en onze nieuwe functie te testen.

dany@pindabook:~$ cdls Afbeeldingen/
Achtergronden   Achtergrond.jpg   dany.JPG  'Dany Pinoy.jpg'   Schermafdrukken
dany@pindabook:~/Afbeeldingen$ cd

De tweede opdracht (cd) zorgt ervoor dat we terugkeren naar de persoonlijke map.

Je kunt nu de functie cdls gebruiken om een map te openen en direct de inhoud ervan weer te geven.

Met de declare opdracht kan je in Bash functies beheren. De declare opdracht met de optie -F gebruik je om alle gedefinieerde functies op te sommen:

dany@pindabook:~$ declare -F
declare -f __expand_tilde_by_ref
declare -f __git_eread
declare -f __git_ps1
...
declare -f cdls
...
declare -f gawkpath_prepend
declare -f quote
declare -f quote_readline

Dit geeft de namen van alle functies weer. Als je de namen en definities wilt zien, gebruik dan:

dany@pindabook:~$ declare -f
__expand_tilde_by_ref ()  
{  
   [[ -n ${1+set} ]] || return 0;
   [[ $1 == REPLY ]] || local REPLY;
   _comp_expand_tilde "${!1-}";
   [[ $1 == REPLY ]] || printf -v "$1" "$REPLY"
}
...
}
cdls ()  
{  
   cd "$@" && ls --color=auto --color=auto
}
...
quote_readline ()  
{  
   local REPLY;
   _comp_quote_compgen "$1";
   printf %s "$REPLY"
}

Om de definitie van een specifieke functie te bekijken, gebruik je declare -f gevolgd door de naam van de functie, bijv.:

dany@pindabook:~$ declare -f cdls
cdls ()  
{  
   cd "$@" && ls --color=auto --color=auto
}

Je merkt dat wat weergegeven wordt, verschilt van wat we zelf definieerden. Dit komt door een alias waardoor de ls opdracht automatisch wordt aangevuld met de optie --color=auto. M.a.w. de optie in onze definitie mag zonder gevolgen verwijderd worden.

dany@pindabook:~$ alias
alias ls='ls --color=auto'

Om een functie te deactiveren, gebruik je de unset opdracht:

dany@pindabook:~$ unset -f cdls

Om een functie terug te activeren, gebruik je de source opdracht:

dany@pindabook:~$ source .bash_functions/cdls.sh  

Om een functie te bewerken, kun je:

Bijvoorbeeld, om de functie cdls te bewerken, kopiëren we deze door de uitvoer van de declare -f opdracht op te slaan in een tijdelijk bestand:

dany@pindabook:~$ declare -f cdls > /tmp/cdls.sh

We bewerken het tijdelijke bestand met nano:

dany@pindabook:~$ nano /tmp/cdls.sh

En passen de functie aan tot:

cdls ()
{
   cd "$@" && ls -l
}

Sla de aanpassing op met de sneltoets Ctrl+s en sluit nano af met Ctrl+x. Activeer de aangepaste tijdelijke functie:

dany@pindabook:~$ source /tmp/cdls.sh

Geef als test de definitie van de aangepaste functie weer en test de nieuwe functie:

dany@pindabook:~$ declare -f cdls
cdls ()  
{  
   cd "$@" && ls --color=auto -l
}
dany@pindabook:~$ cdls Afbeeldingen/
totaal 5412
drwxr-xr-x 3 dany users   12288 28 jun 10:23  Achtergronden
-rw-r--r-- 1 dany users  612328 28 jun 14:37  Achtergrond.jpg
-rw-r--r-- 1 dany dany   507643  3 dec  2004  dany.JPG
-rw-r--r-- 1 dany dany  4401459 25 nov  2015 'Dany Pinoy.jpg'
drwxrwxr-x 3 dany dany     4096 28 jun 10:23  Schermafdrukken
dany@pindabook:~/Afbeeldingen$ cd

Zorg dat je terug in de persoonlijke map werkt (laatste cd opdracht) en kopieer op dezelfde manier de tijdelijke functiedefinitie naar de map met permanente functiedefinities:

dany@pindabook:~$ declare -f cdls > ~/.bash_functions/cdls.sh

Vergelijken we echter de tijdelijke definitie met de definitieve definitie:

dany@pindabook:~$ diff /tmp/cdls.sh .bash_functions/cdls.sh  
1,3c1,3
< cdls ()
< {
<     cd "$@" && ls -l
---
> cdls ()  
> {  
>     cd "$@" && ls --color=auto -l

Dan merken we opnieuw dat de ls alias roet in het eten gooit. M.a.w. je maakt beter kopieën met de klassieke cp opdracht:

dany@pindabook:~$ cp /tmp/cdls.sh .bash_functions/

En bij het vergelijken:

dany@pindabook:~$ diff /tmp/cdls.sh .bash_functions/cdls.sh  

Wordt niets gemeld, dus zijn de beide bestanden identiek.

Om te controleren of een functie actief is, gebruik je de declare -f opdracht en filter je de uitvoer met grep:

dany@pindabook:~$ declare -F cdls | grep "cdls"
cdls

Als je bijvoorbeeld een functie wilt schrijven om te testen of een functie bestaat, kan je best even nagaan of de functienaam die je wilt gebruiken niet al in gebruik is:

dany@pindabook:~$ declare -F cdls | grep "fexist"

Geen melding, dus de functienaam fexist is nog vrij. We maken de functie fexist aan met de teksteditor nano:

dany@pindabook:~$ nano ~/.bash_functions/fexist.sh

Met de volgende opdrachtregels om te testen of een opgegeven functie actief is:

fexist ()
{
 if declare -F $1 > /dev/null; then
   echo "Function exists"
 else
   echo "Function does not exist"
 fi
}

Sla de aanpassing op met de sneltoets Ctrl+s en sluit nano af met Ctrl+x. Activeer de nieuwe functie:

dany@pindabook:~$ source .bash_functions/fexist.sh  

En test de werking van de nieuwe functie met de volgende opdrachten:

dany@pindabook:~$ fexist cdls
Function exists
dany@pindabook:~$ fexist fexist
Function exists
dany@pindabook:~$ fexist verzonnen
Function does not exist

Bash Functies

Opruimen