Het geheim van de eerste regel in een Linux‑script: wat is #!/usr/bin/env bash en #!/bin/bash?

Wanneer je een script schrijft op Linux, zie je vaak bovenaan deze regel.

#!/usr/bin/env bash

of

#!/bin/bash

Op het eerste gezicht lijkt het gewoon een commentaar… maar wat is de identiteit van deze regel? En wat is het verschil tussen de twee? In dit artikel gaan we die regel goed begrijpen en bepalen wanneer je welke vorm moet gebruiken.


1. Het is geen commentaar: wat is een shebang?



Een regel die begint met #! wordt een shebang genoemd.

#!/bin/bash

Voor de shell ziet het eruit als een commentaar, maar voor het kern is het een instructie:

“Laat het systeem weten welke interpreter dit script moet gebruiken.”

Dus:

  • #!/bin/bash → “Gebruik /bin/bash om dit bestand uit te voeren.”
  • #!/usr/bin/env bash → “Zoek via env de bash‑interpreter en gebruik die.”

2. Hoe voert het kern een script uit?

De uitvoering kan zo samengevat worden:

  1. De gebruiker voert een script met uitvoeringsrechten uit.
chmod +x script.sh
./script.sh
  1. Het kern leest script.sh.
  2. Het controleert of de eerste twee tekens #! zijn.
  3. Zo ja, dan interpreteert het de rest van de regel als * “pad naar de interpreter + optionele argumenten” * en voert die interpreter uit met het scriptbestand als argument.

Bijvoorbeeld, als de eerste regel #!/bin/bash is, doet het kern ongeveer:

/bin/bash script.sh

Opmerking: er mag geen spatie staan vóór #!. De eerste twee tekens moeten exact # en ! zijn.


3. Wat betekent #!/bin/bash?



Dit is de meest voorkomende vorm.

#!/bin/bash

Betekenis

  • “Dit is een bash‑script en de bash‑interpreter bevindt zich op /bin/bash.”
  • Het kern zal altijd /bin/bash gebruiken.

Voordelen

  • Duidelijk: je weet precies welke bash‑versie wordt gebruikt.
  • Snel: geen extra zoekopdracht via env.
  • Op de meeste Linux‑distributies is /bin/bash de standaardlocatie.

Nadelen

  • Minder portabel: op sommige systemen bevindt bash zich op een andere plek, of is het helemaal niet geïnstalleerd.
  • Op macOS, BSD, NixOS of sommige containers kan het pad anders zijn.

4. Wat betekent #!/usr/bin/env bash?

Dit is de moderne, vaak gebruikte vorm.

#!/usr/bin/env bash

Het kern voert hier zoiets uit:

/usr/bin/env bash script.sh

env zoekt in de PATH naar het bash‑programma.

Voordelen

  1. Portabel: werkt op systemen waar bash op een andere plek staat.
  2. Gebruikers‑specifiek: als een gebruiker een eigen versie van bash in de PATH heeft, wordt die gebruikt.
  3. Uniform: dezelfde aanpak werkt ook voor Python, Ruby, etc.

Nadelen

  1. /usr/bin/env moet bestaan – dit is bijna altijd het geval, maar niet in alle omgevingen.
  2. PATH kan leiden tot onverwachte interpreters.
  3. Beveiligingsrisico: in zeer beveiligde omgevingen kan het zoeken via PATH ongewenst zijn.

5. Samenvatting van de vergelijking

Kenmerk #!/bin/bash #!/usr/bin/env bash
Interpreter‑pad Absoluut, vast Via PATH gezocht
Portabiliteit Laag Hoog
Welke bash? Altijd /bin/bash Eerste bash in PATH
Versie‑garantie Relatief eenvoudig Afhankelijk van PATH
Beveiliging Sterker (vast pad) Minder streng (afhankelijk van PATH)
Trend Oudere stijl Moderne, aanbevolen stijl

6. Wanneer welke vorm gebruiken?

1) Persoonlijke of team‑scripts (algemeen ontwikkel‑environement)

Gebruik #!/usr/bin/env bash.

Reden: ontwikkelaars hebben vaak verschillende bash‑locaties; env biedt flexibiliteit.

2) Scripts voor een specifieke, vaste serveromgeving

Gebruik #!/bin/bash.

Reden: garandeert dezelfde interpreter, voorkomt onverwachte gedrag door PATH‑wijzigingen.

3) Maximaal portabel maken

Overweeg #!/bin/sh als je geen bash‑specifieke functies nodig hebt.

Reden: sh is bijna overal aanwezig.


7. Praktische tips voor #!/usr/bin/env bash

1) Uitvoeren

chmod +x script.sh
./script.sh

Zorg dat je het script zelf uitvoert, zodat het kern de shebang leest.

2) Argumenten

#!/usr/bin/env bash

echo "Interpreter: $0"
echo "Arguments: $@"

Uitvoer:

Interpreter: ./script.sh
Arguments: hello world

$0 is het pad naar het script; het kern voert eigenlijk /usr/bin/env bash script.sh hello world uit.


8. Veelvoorkomende misvattingen

“De eerste regel is alleen commentaar, dus kan ik het weglaten.”

  • Het is niet verplicht als je het script altijd via een interpreter uitvoert (bijv. bash script.sh).
  • Voor “tool‑scripts” die anderen kunnen uitvoeren, is een shebang echter essentieel.

#!/bin/env werkt ook.”

  • Sommige systemen hebben /bin/env, maar /usr/bin/env is de standaard, dus gebruik die.

9. Conclusie

  • #!/usr/bin/env bash en #!/bin/bash zijn geen commentaar, maar instructies voor het kern.
  • #!/bin/bash is vast en voorspelbaar, maar minder portabel.
  • #!/usr/bin/env bash is flexibeler en portabel, maar afhankelijk van PATH.
  • In moderne ontwikkel‑ en distributie‑omgevingen is #!/usr/bin/env bash de aanbevolen keuze.

image of shebang in linux script