mktemp

Tworzy unikalny plik lub katalog tymczasowy i zwraca jego nazwę.

mktemp tworzy unikalny plik lub katalog tymczasowy w bezpieczny sposób i wypisuje jego nazwę na standardowe wyjście. Brzmi banalnie, ale rozwiązuje realny problem: gdy w skrypcie sam wymyślasz nazwę typu /tmp/mojplik, narażasz się na kolizje (dwie instancje skryptu nadpiszą sobie dane) i na ataki przez dowiązania symboliczne. mktemp generuje losową, niepowtarzalną nazwę i od razu tworzy plik z bezpiecznymi uprawnieniami, więc używasz go zawsze tam, gdzie potrzebujesz schowka na chwilę.

Składnia i najważniejsze opcje

Podstawowa składnia: mktemp [OPCJE] [SZABLON]

SZABLON to nazwa zakończona przynajmniej trzema znakami X, które mktemp zamieni na losowe znaki. Bez szablonu użyje domyślnego tmp.XXXXXXXXXX w katalogu tymczasowym.

  • -d, --directory — tworzy katalog zamiast pliku.
  • -u, --dry-run — tylko wypisuje nazwę, nic nie tworzy (oznaczone w manualu jako niebezpieczne, bo otwiera okno na kolizję).
  • -p DIR, --tmpdir[=DIR] — interpretuje szablon względem katalogu DIR; bez podania DIR bierze $TMPDIR, a w razie braku /tmp.
  • -t — traktuje szablon jako sam człon nazwy w katalogu tymczasowym (opcja przestarzała, zostawiona dla zgodności).
  • --suffix=SUFF — dokleja końcówkę za losową częścią, np. .txt; przydatne, gdy coś wymaga konkretnego rozszerzenia.
  • -q, --quiet — wycisza komunikaty o błędach tworzenia.

Przykłady użycia

  • mktemp — tworzy pojedynczy plik w /tmp i wypisuje jego pełną ścieżkę, np. /tmp/tmp.k3Jd9aQ1bX.
  • tmp=$(mktemp) — najczęstszy idiom w skryptach: zapamiętujesz nazwę w zmiennej, by potem pisać do pliku i go posprzątać.
  • mktemp -d — zakłada katalog tymczasowy, idealny gdy potrzebujesz miejsca na kilka plików roboczych.
  • mktemp /tmp/backup.XXXXXX — własny szablon z czytelnym prefiksem, łatwiej go potem rozpoznać na liście.
  • mktemp --suffix=.json data.XXXXXX — plik z rozszerzeniem .json, gdy narzędzie odmawia współpracy bez właściwej końcówki.

Częste błędy i pułapki

Najczęstsza wpadka to za mało X w szablonie — GNU mktemp wymaga co najmniej trzech na końcu, inaczej dostaniesz błąd. mktemp tworzy tylko ostatni człon ścieżki, więc mktemp /nieistnieje/plik.XXXXXX zawiedzie, jeśli katalog nadrzędny nie istnieje. Pamiętaj też, że mktemp nic za Ciebie nie sprząta — usuwasz sam, najlepiej przez trap 'rm -rf "$tmp"' EXIT na początku skryptu, żeby śmieci znikały nawet po błędzie.

Uwaga na różnice systemowe: wersja z BSD i macOS ma inną składnię (tam -t przyjmuje prefiks jako argument), więc skrypty pisane pod GNU/Linux potrafią się wykrzaczyć na Macu. Na koniec: -u kusi prostotą, ale skoro tylko zwraca nazwę bez tworzenia pliku, tracisz całą ochronę przed kolizją — używaj świadomie.

Powiązane komendy: tempfile, mkdir, mktemp -d, trap, rm oraz zmienna środowiskowa TMPDIR.