Een script dat schrijft naar /tmp/rapport.txt kan een probleem veroorzaken: een andere uitvoering kan die naam al gebruiken, en een lokale gebruiker kan een symbolische koppeling in uw plaats voorbereiden. mktemp maakt het bestand of de map met een onvoorspelbare naam en reserveert het onmiddellijk voor het script.
Gebruik een tijdelijk bestand voor een tussenresultaat, en maak het daarna schoon met trap. Het script houdt zo zijn map schoon, zelfs in het geval van een fout of onderbreking.

Maak de naam niet met $$
Deze oude gewoonte blijft riskant:
tmp="/tmp/rapport-$$.txt"
echo "resultaat" > "$tmp"
De PID maakt de naam niet geheim en het bestand wordt niet gemaakt op het moment dat je het berekent. Tussen het bouwen van het pad en het schrijven kan een ander proces deze naam in gebruik nemen. mktemp maakt het object voordat het je het pad retourneert.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "resultaat" > "$tmp_file"
De sjabloon moet minstens drie X aaneengeschakelde hebben in het laatste onderdeel. De tekens worden vervangen bij de creatie. Houd altijd de aanhalingstekens rond de variabele: TMPDIR kan een spatie bevatten.
Een tijdelijke map maken voor meerdere bestanden
Een tijdelijke map voorkomt dat meerdere bestanden verspreid worden in /tmp. Dit is handig voor een archief dat moet worden voorbereid, een conversie of een rapport dat tussenbestanden produceert.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" backup.XXXXXX) || exit 1
printf '%sn' "gegevens" > "$workdir/lijst.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/lijst.txt"
De meeste systemen maken deze map aan met rechten die zijn gereserveerd voor uw account. Controleer dit wanneer het script een sleutel, een export of een archief met gevoelige gegevens beheert:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Schoonmaken met trap zonder een verkeerd pad te wissen
Definieer de schoonmaakfunctie direct na het maken van de map. Controleer of de variabele bestaat en naar de verwachte map wijst vóór je rm -rf aanroept.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mijn-script.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# scriptverwerking hier
trap ... EXIT voert de schoonmaak uit wanneer de shell eindigt. De signalen HUP, INT en TERM dekken de gebruikelijke onderbrekingen. Een abrupte stop met kill -9 geeft de shell geen tijd om deze functie uit te voeren, dus het is ook nodig om gecontroleerde schoonmaak voor zware processen te plannen.
- creëer het pad met
mktemp, nooit met een datum of$$; - gebruik
mktemp -dals het script meerdere bestanden produceert; - verwijder alleen een variabele die door het script is gemaakt en gecontroleerd;
- houd het tijdelijke bestand als je een fout moet diagnosticeren, en verwijder het daarna na analyse.
De gids over de Bash-historie helpt te voorkomen dat een wachtwoord dat op een opdrachtregel is ingevoerd, in ~/.bash_history blijft staan. Voor het archiveren van het eindresultaat, raadpleeg ook tar-archieven maken en extraheren onder Linux.