Skript, které zapisuje do /tmp/rapport.txt, nakonec vytváří problém: jiný proces již může používat toto jméno a místní uživatel může připravit symbolický odkaz vaším jménem. mktemp vytváří soubor nebo adresář s nepředvídatelným názvem a okamžitě jej rezervuje pro skript.
Použijte dočasný soubor pro meziprodukt a poté ho vyčistěte pomocí trap. Skript tak udržuje svůj adresář čistý i v případě chyby nebo přerušení.

Nevyrábějte název pomocí $$
Tato stará zvyklost zůstává riskantní:
tmp="/tmp/rapport-$$.txt"
echo "výsledek" > "$tmp"
PID nedělá jméno tajným a soubor není vytvořen v okamžiku, kdy jej počítáte. Mezi konstrukcí cesty a zápisem může jiný proces obsadit toto jméno. mktemp vytváří objekt, než vám vrátí jeho cestu.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "výsledek" > "$tmp_file"
Šablona musí obsahovat alespoň tři X po sobě jdoucí v poslední komponentě. Znaky jsou při vytváření nahrazeny. Vždy uchovávejte uvozovky kolem proměnné: TMPDIR může obsahovat mezeru.
Vytvořte dočasný adresář pro více souborů
Dočasný adresář zabrání rozptýlení více souborů v /tmp. Je to užitečné pro připravovanou archivaci, konverzi nebo zprávu, která produkuje meziprodukty.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" záloha.XXXXXX) || exit 1
printf '%sn' "data" > "$workdir/liste.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/liste.txt"
Většina systémů vytváří tento adresář s právy vyhrazenými pro váš účet. Zkontrolujte to, když skript manipuluje s klíčem, exportem nebo archivem obsahujícím citlivá data:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Čistěte pomocí trap bez vymazání špatné cesty
Nastavte funkci pro úklid hned po vytvoření adresáře. Ověřte, že proměnná existuje a správně ukazuje na očekávaný adresář před voláním rm -rf.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" můj-skript.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# zpracování skriptu zde
trap ... EXIT spustí úklid, když shell končí. Signály HUP, INT a TERM pokrývají obvyklá přerušení. Násilné zastavení pomocí kill -9 nedává shellu čas na provedení této funkce, je tedy třeba také plánovat kontrolovaný úklid pro větší zpracování.
- vytvářejte cestu pomocí
mktemp, nikdy pomocí data nebo$$; - použijte
mktemp -d, pokud skript produkuje více souborů; - odstraňte pouze proměnnou, kterou skript vytvořil a ověřil;
- uchovejte dočasný soubor, pokud musíte diagnostikovat selhání, a pak jej po analýze odstraňte.
Návod na historii Bash pomáhá zabránit tomu, aby heslo zadané na příkazovém řádku zůstalo v ~/.bash_history. Pro archivaci konečného výsledku se podívejte také na vytvoření a extrakci archivu tar pod Linuxem.