Um script que escreve em /tmp/relatorio.txt acaba criando um problema: outro lançamento pode já estar usando esse nome, e um usuário local pode preparar um link simbólico em seu lugar. mktemp cria o arquivo ou diretório com um nome imprevisível e o reserva imediatamente para o script.
Use um arquivo temporário para uma saída intermediária e, em seguida, limpe-o com trap. O script mantém assim seu diretório limpo mesmo em caso de erro ou interrupção.

Não crie o nome com $$
Esse antigo hábito continua arriscado:
tmp="/tmp/relatorio-$$.txt"
echo "resultado" > "$tmp"
O PID não torna o nome secreto e o arquivo não é criado no momento em que você o calcula. Entre a construção do caminho e a gravação, outro processo pode ocupar esse nome. mktemp cria o objeto antes de retornar seu caminho.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" relatorio.XXXXXX) || exit 1
printf '%sn' "resultado" > "$tmp_file"
O modelo deve conter pelo menos três X consecutivos em seu último componente. Os caracteres são substituídos durante a criação. Sempre mantenha as aspas em torno da variável: TMPDIR pode conter um espaço.
Criar um diretório temporário para vários arquivos
Um diretório temporário evita dispersar vários arquivos em /tmp. Isso é útil para um arquivo a ser preparado, uma conversão ou um relatório que produz arquivos intermediários.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" backup.XXXXXX) || exit 1
printf '%sn' "dados" > "$workdir/lista.txt"
tar -czf "$workdir/relatorio.tar.gz" "$workdir/lista.txt"
A maioria dos sistemas cria esse diretório com permissões restritas à sua conta. Verifique isso quando o script manipula uma chave, uma exportação ou um arquivo contendo dados sensíveis:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Limpar com trap sem apagar um caminho errado
Defina a função de limpeza logo após a criação do diretório. Verifique se a variável existe e se ela realmente aponta para o diretório esperado antes de chamar rm -rf.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" meu-script.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# processamento do script aqui
trap ... EXIT inicia a limpeza quando o shell termina. Os sinais HUP, INT e TERM cobrem as interrupções habituais. Uma parada abrupta com kill -9 não dá ao shell tempo para executar essa função, portanto, é necessário também prever uma limpeza controlada para os processos pesados.
- crie o caminho com
mktemp, nunca com uma data ou$$; - use
mktemp -dse o script produzir vários arquivos; - exclua apenas uma variável criada e verificada pelo script;
- mantenha o arquivo temporário se você precisar diagnosticar uma falha e, depois, exclua-o após a análise.
O guia sobre o histórico do Bash ajuda a evitar que uma senha dada em uma linha de comando permaneça em ~/.bash_history. Para arquivar o resultado final, consulte também criar e extrair um arquivo tar no Linux.