Un script que escribe en /tmp/rapport.txt termina por crear un problema: otro lanzamiento puede ya estar utilizando este nombre, y un usuario local puede preparar un enlace simbólico en su lugar. mktemp crea el archivo o el directorio con un nombre impredecible y lo reserva inmediatamente para el script.
Utilice un archivo temporal para una salida intermedia, y luego bórrelo con trap. De este modo, el script mantiene su directorio limpio incluso en caso de error o interrupción.

No fabrique el nombre con $$
Este antiguo hábito sigue siendo arriesgado:
tmp="/tmp/rapport-$$.txt"
echo "resultado" > "$tmp"
El PID no hace que el nombre sea secreto y el archivo no se crea en el momento en que lo calcula. Entre la construcción de la ruta y la escritura, otro proceso puede ocupar ese nombre. mktemp crea el objeto antes de devolverle su ruta.
tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "resultado" > "$tmp_file"
El modelo debe contener al menos tres X consecutivos en su último componente. Los caracteres se reemplazan al momento de la creación. Mantenga siempre las comillas alrededor de la variable: TMPDIR puede contener un espacio.
Crear un directorio temporal para varios archivos
Un directorio temporal evita dispersar varios archivos en /tmp. Esto es útil para un archivo que preparar, una conversión o un reporte que produce archivos intermedios.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" respaldo.XXXXXX) || exit 1
printf '%sn' "datos" > "$workdir/lista.txt"
tar -czf "$workdir/rapporto.tar.gz" "$workdir/lista.txt"
La mayoría de los sistemas crean este directorio con derechos reservados a su cuenta. Verifíquelo cuando el script manipule una clave, una exportación o un archivo que contenga datos sensibles:
stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"
Limpiar con trap sin borrar un camino incorrecto
Defina la función de limpieza justo después de la creación del directorio. Verifique que la variable exista y que apunte al directorio esperado antes de llamar a rm -rf.
workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mi-script.XXXXXX) || exit 1
cleanup() {
[ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM
# procesamiento del script aquí
trap ... EXIT inicia la limpieza cuando el shell termina. Las señales HUP, INT y TERM cubren las interrupciones habituales. Una parada abrupta con kill -9 no deja al shell tiempo para ejecutar esta función, por lo que también se debe prever una limpieza controlada para los grandes procesos.
- crea el camino con
mktemp, nunca con una fecha o$$; - use
mktemp -dsi el script produce varios archivos; - borrar únicamente una variable creada y verificada por el script;
- mantenga el archivo temporal si debe diagnosticar un fallo, luego elimínelo después del análisis.
La guía sobre el historial de Bash ayuda a evitar que una contraseña dada en una línea de comando permanezca en ~/.bash_history. Para archivar el resultado final, consulte también crear y extraer un archivo tar en Linux.