Quelle est la différence entre tempfile et mktemp?

La plupart des systèmes que j’ai rencontrés ont à la fois tempfile(1) et mktemp(1) . Il existe des différences syntaxiques et mktemp peut également créer des répertoires, mais ils semblent faire la même chose.

Y a-t-il une différence entre les deux? Pourquoi les deux existent-ils? L’un est-il plus standard que l’autre? Si je veux juste créer un fichier temporaire en toute sécurité, y a-t-il une raison de préférer l’un à l’autre?

Je soupçonne qu’il y a des informations intéressantes sur Unix derrière cela, mais mes recherches ne donnent rien.

Je soupçonne qu’il y a des informations intéressantes sur Unix derrière ça …

L’ histoire de mktemp peut être retracée à OpenBSD 2.1 . Cependant, il est devenu une partie de GNU coreutils beaucoup plus tard. Ce post annonçait l’inclusion de mktemp pour coreutils .

Jusque-là, tempfile était utilisé par un certain nombre de programmes. Il y avait aussi une proposition pour faire de tempfile un wrapper autour de mktemp , qui a été rejeté pour décourager l’utilisation de tempfile .

Cependant, ce qui suit a été ajouté au manuel de tempfile :

La création exclusive n’est pas garantie lors de la création de fichiers sur des partitions NFS. tempfile ne peut pas créer de répertoires temporaires. tempfile est obsolète; Vous devriez utiliser mktemp(1) place.

Il dit dans le manuel de tempfile que:

tempfile - create a temporary file in a safe manner

Alors que dans mktemp:

mktemp - create a temporary file or directory

Ils sont probablement presque les mêmes, seulement que la mise en œuvre est un peu différente.

Comme dit dans le manuel, tempfile en fait quelques précautions comme:

a) TMPDIR variable d’environnement TMPDIR existe et contient le nom d’un répertoire approprié, celui-ci est utilisé.

b) Sinon, si l’argument --directory est spécifié et approprié, il est utilisé.

c) Sinon, P_tmpdir (tel que défini dans ) est utilisé lorsque cela est approprié.

d) Enfin, un répertoire défini par l’implémentation ( /tmp ) peut être utilisé.

C’est vraiment utile si le script fait mktemp confiance à mktemp ou tempfile pour qu’il soit certain qu’un fichier ou un répertoire temporaire sera créé. Mais je ne vois pas beaucoup de problème en utilisant simplement mktemp si vous exécutez vous-même des précautions dans votre script. Vous pouvez utiliser [ -e ] , [ -f ] , [ -d ] , [ -L ] , etc. pour vérifier si un fichier peut réellement être créé / a déjà été créé. Vérifiez même si quelque chose est accessible en écriture, lisible et / ou exécutable avec -r, -w et -x. En bash, voir le help test .

Toujours dans l’intérêt de l’exécution continue, vous feriez peut-être mieux de compter sur tempfile lors de l’exécution de votre code dans plusieurs environnements. Assurez-vous simplement qu’il est disponible partout. Avec which ou avec type -P vous pouvez vérifier lequel d’entre eux est disponible. Un exemple:

 create_temp() { if type -P tempfile >/dev/null; then # use tempfile based from $1 elif type -P mktemp > /dev/null; then # use mktemp based from $1 else echo "Can't find temporary file creator." exit 1 fi } 

Du sharepoint vue du code source des choses (sur debian), tempfile provient du paquet debianutils et utilise la fonction libc tempnam() alors que mktemp provient de GNU coreutils et n’utilise pas la fonction libc