Skrypt, który zapisuje do /tmp/rapport.txt, może prowadzić do problemu: inny proces może już używać tej nazwy, a lokalny użytkownik może przygotować symboliczne łącze w twoim imieniu. mktemp tworzy plik lub folder z nieprzewidywalną nazwą i natychmiast rezerwuje go dla skryptu.
Użyj pliku tymczasowego do wyjścia pośredniego, a następnie usuń go za pomocą trap. W ten sposób skrypt utrzymuje swoje katalogi w czystości nawet w przypadku błędu lub przerwania.

Nie twórz nazwy z $$
Ten stary nawyk jest nadal ryzykowny:
tmp="/tmp/rapport-$$.txt"
echo "wynik" > "$tmp"
PID nie czyni nazwy tajemną, a plik nie jest tworzony w momencie, gdy go obliczasz. Między tworzeniem ścieżki a zapisem inny proces może zająć tę nazwę. mktemp tworzy obiekt przed zwróceniem jego ścieżki.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" raport.XXXXXX) || exit 1
printf '%sn' "wynik" > "$tmp_file"
Szablon musi zawierać co najmniej trzy X z rzędu w swojej ostatniej części. Znaki są zastępowane podczas tworzenia. Zawsze trzymaj cudzysłowy wokół zmiennej: TMPDIR może zawierać spację.
Tworzenie tymczasowego folderu dla wielu plików
Tymczasowy folder zapobiega rozsypaniu wielu plików w /tmp. Jest to przydatne przy przygotowywaniu archiwum, konwersji lub raporcie, który generuje pliki pośrednie.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" backup.XXXXXX) || exit 1
printf '%sn' "dane" > "$workdir/liste.txt"
tar -czf "$workdir/raport.tar.gz" "$workdir/liste.txt"
Większość systemów tworzy ten katalog z uprawnieniami zarezerwowanymi dla twojego konta. Sprawdź to, gdy skrypt obsługuje klucz, eksport lub archiwum z danymi wrażliwymi:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Czyszczenie z użyciem trap bez usuwania niewłaściwej ścieżki
Zdefiniuj funkcję czyszczenia tuż po utworzeniu folderu. Sprawdź, czy zmienna istnieje i rzeczywiście wskazuje oczekiwany katalog przed wywołaniem rm -rf.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mój-skrypt.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# przetwarzanie skryptu tutaj
trap ... EXIT uruchamia czyszczenie, gdy powłoka kończy działanie. Sygnalizacje HUP, INT i TERM obejmują typowe przerwania. Nagłe zatrzymanie za pomocą kill -9 nie daje powłoce czasu na wykonanie tej funkcji, dlatego należy przewidzieć również kontrolowane czyszczenie dla dużych procesów.
- twórz ścieżkę za pomocą
mktemp, nigdy za pomocą daty lub$$; - użyj
mktemp -d, jeśli skrypt generuje wiele plików; - usuń tylko zmienną stworzoną i zweryfikowaną przez skrypt;
- zachowaj plik tymczasowy, jeśli musisz zdiagnozować błąd, a następnie usuń go po analizie.
Poradnik na historii Bash pomaga uniknąć wystąpienia hasła podanego w linii poleceń w ~/.bash_history. Aby zarchiwizować ostateczny wynik, sprawdź też tworzenie i rozpakowywanie archiwum tar w systemie Linux.