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 kataloguDIR; bez podaniaDIRbierze$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/tmpi 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.