Ein Skript, das in /tmp/rapport.txt schreibt, führt zu einem Problem: Ein anderer Start kann bereits diesen Namen verwenden, und ein lokaler Benutzer kann an Ihrer Stelle einen symbolischen Link vorbereiten. mktemp erstellt die Datei oder das Verzeichnis mit einem unvorhersehbaren Namen und reserviert es sofort für das Skript.
Verwenden Sie eine temporäre Datei für eine Zwischenausgabe und bereinigen Sie sie mit trap. Das Skript hält so sein Verzeichnis sauber, selbst im Falle eines Fehlers oder einer Unterbrechung.

Erschaffen Sie den Namen nicht mit $$
Diese alte Gewohnheit bleibt riskant:
tmp="/tmp/rapport-$$.txt"
echo "Ergebnis" > "$tmp"
Die PID macht den Namen nicht geheim und die Datei wird nicht zum Zeitpunkt Ihrer Berechnung erstellt. Zwischen dem Erstellen des Pfades und dem Schreiben kann ein anderer Prozess diesen Namen belegen. mktemp erstellt das Objekt, bevor es Ihnen den Pfad zurückgibt.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "Ergebnis" > "$tmp_file"
Das Muster muss mindestens drei aufeinanderfolgende X in seinem letzten Bestandteil enthalten. Die Zeichen werden bei der Erstellung ersetzt. Halten Sie immer die Anführungszeichen um die Variable: TMPDIR kann ein Leerzeichen enthalten.
Einen temporären Ordner für mehrere Dateien erstellen
Ein temporärer Ordner verhindert das Verstreuen mehrerer Dateien im /tmp. Es ist nützlich, um ein Archiv vorzubereiten, eine Konvertierung oder einen Bericht, der Zwischendateien produziert.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" sauvegarde.XXXXXX) || exit 1
printf '%sn' "Daten" > "$workdir/liste.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/liste.txt"
Die meisten Systeme erstellen dieses Verzeichnis mit Rechten, die nur auf Ihr Konto beschränkt sind. Überprüfen Sie dies, wenn das Skript mit einem Schlüssel, einem Export oder einem Archiv, das sensible Daten enthält, umgeht:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Reinigen mit trap, ohne einen falschen Pfad zu löschen
Definieren Sie die Bereinigungsfunktion direkt nach der Erstellung des Ordners. Überprüfen Sie, ob die Variable existiert und tatsächlich auf das erwartete Verzeichnis verweist, bevor Sie rm -rf aufrufen.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mein-skript.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# Skriptverarbeitung hier
trap ... EXIT beginnt die Bereinigung, wenn die Shell endet. Die Signale HUP, INT und TERM decken die üblichen Unterbrechungen ab. Ein brutales Stoppen mit kill -9 gibt der Shell keine Zeit, diese Funktion auszuführen, daher sollte auch für umfangreiche Verarbeitungen eine kontrollierte Bereinigung vorgesehen werden.
- erstellen Sie den Pfad mit
mktemp, niemals mit einem Datum oder$$; - verwenden Sie
mktemp -d, wenn das Skript mehrere Dateien erzeugt; - löschen Sie nur eine vom Skript erstellte und überprüfte Variable;
- behalten Sie die temporäre Datei, wenn Sie einen Fehler diagnostizieren müssen, und löschen Sie sie nach der Analyse.
Der Leitfaden zu Bash-Historie hilft, zu vermeiden, dass ein Passwort, das auf einer Befehlszeile eingegeben wurde, in ~/.bash_history bleibt. Um das endgültige Ergebnis zu archivieren, konsultieren Sie auch ein Tar-Archiv unter Linux erstellen und extrahieren.