Comment créer un file temporaire dans le script shell?

Lors de l'exécution d'un script, je veux créer un file temporaire dans le /tmp .

Après l'exécution de ce script, ce script sera nettoyé.

Comment faire cela dans le script shell?

 tmpfile=$(mktemp /tmp/abc-script.XXXXXX) : ... rm "$tmpfile" 

Vous pouvez vous assurer qu'un file est supprimé lorsque les scripts se terminent (y compris les tue et se bloque) en ouvrant un descripteur de file au file et en le supprimant. Le file rest disponible (pour le script, pas vraiment pour les autres process, mais /proc/$PID/fd/$FD est un correctif) tant que le descripteur de file est ouvert. Lorsqu'il est fermé (que le kernel fait automatiquement lorsque le process se termine), le système de files supprime le file.

 tmpfile=$(mktemp /tmp/abc-script.XXXXXX) exec 3>"$tmpfile" rm "$tmpfile" : ... echo foo >&3 

Utilisez mktemp pour créer un file temporaire ou un directory:

 temp_file=$(mktemp) 

Ou pour une direcotry:

 temp_dir=$(mktemp -d) 

A la fin du script, vous devez supprimer le file temporaire / dir:

 rm ${temp_file} rm -R ${temp_dir} 

mktemp crée un file dans le /tmp ou dans le directory fourni avec l'argument --tmpdir .

Si vous êtes sur le système qui a mktemp , vous devriez l'utiliser comme d'autres réponses.

Avec le toolchest POSIX:

 umask 0177 tmpfile=/tmp/"$0"."$$"."$(awk 'BEGIN {srand();printf "%d\n", rand() * 10^10}')" trap 'rm -f -- "$tmpfile"' INT TERM HUP EXIT : > "$tmpfile" 

Certains obus ont la fonctionnalité embeddede.

zsh

zsh 's =(...) forme de substitution de process utilise un file temporaire. Par exemple =(echo test) développe le path d'un file temporaire qui contient test\n .

 $ {cat $file; ls -l /dev/fd/3; echo test2 >&3; cat $file} 3<> ${file::==(echo test)} test lrwx------ 1 stephane stephane 64 Jan 30 11:19 /dev/fd/3 -> /tmp/zshMLbER0 test2 

Ce file est automatiquement supprimé, une fois la command terminée.

bash / zsh sous Linux.

Ici-files ou here-ssortingngs dans bash et zsh sont implémentés en tant que files temporaires supprimés.

Donc, si vous le faites:

 exec 3<<< test 

Le descripteur de file 3 est connecté à un file temporaire supprimé contenant test\n .

Vous pouvez get son contenu avec:

 cat <&3 

Si sous Linux, vous pouvez aussi lire ou écrire dans ce file via /dev/fd/3

 $ exec 3<<< test $ cat <&3 test $ echo foo > /dev/fd/3 $ cat /dev/fd/3 foo 

(certains autres shells utilisent des pipes, ou peuvent utiliser /dev/null si le doc ici est vide).

Voici une réponse un peu améliorée dans la lignée de Hauke ​​Laging:

 #!/bin/bash tmpfile=$(mktemp) # Create a temporal file in the default temporal folder of the system # Lets do some magic for the tmpfile to be removed when this script ends, even if it crashes exec {FD_W}>"$tmpfile" # Create file descriptor for writing, using first number available exec {FD_R}<"$tmpfile" # Create file descriptor for reading, using first number available rm "$tmpfile" # Delete the file, but file descriptors keep available for this script # Now it is possible to work with the temporal file echo foo >&$FD_W echo bar >&$FD_W # Note that file descriptor always concatenates, not overwrites cat <&$FD_R