Lors de l'exécution d'un script, je souhaite créer un fichier temporaire dans un /tmp
répertoire.
Après exécution de ce script, il sera nettoyé par ce script.
Comment faire cela en script shell?
shell-script
tmp
Bhuvanesh
la source
la source
/proc
- sauf pour les systèmes qui ne l'ont pas.exec 3> "$tmpfile"
fait? N'est-ce pas seulement utile si le fichier tmp est un script autonome?cat <&3
va donnerBad file descriptor
. J'apprécierais si vous le répariez ou le retiriez; la désinformation n'aide pas beaucoup.Utilisez
mktemp
pour créer un fichier temporaire ou un répertoire:Ou pour un répertoire:
A la fin du script, vous devez supprimer le fichier / répertoire temporaire:
mktemp crée un fichier dans le
/tmp
répertoire ou dans le répertoire donné avec l'--tmpdir
argument.la source
trap "rm -f $temp_file" 0 2 3 15
immédiatement après la création du fichier, de sorte quectrl-C
le fichier soit toujours supprimé lorsque le script se ferme ou s’arrête .EXIT
c'est le seul crochet pourtrap
?kill -9 $somepid
. Ce signal de destruction est une mort imminente et il ne se passe rien d'autre.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
suffit.Si vous utilisez un système qui contient mktemp , vous devriez l’utiliser comme autre réponse.
Avec les outils POSIX:
la source
EXIT
est le seul crochet pourtrap
?tmpfile
reste supprimé avant la sortie du script, mais pas lorsque le script reçoit d'autres signaux.That's not what happens
?mktemp
provient de HP / UX avec une syntaxe différente. Todd C. Miller en a créé un différent pour OpenBSD au milieu des années 90 (copié par FreeBSD et NetBSD) et l'a ensuite rendu disponible en tant qu'utilitaire autonome (www.mktemp.org). C'est celui qui était généralement utilisé sous Linux jusqu'à ce qu'unmktemp
utilitaire (essentiellement compatible) soit ajouté à la coreutils de GNU en 2007. Juste pour dire, on ne peut pas vraiment dire qu'ilmktemp
s'agit d'un utilitaire GNU.Certains coques ont la fonctionnalité intégrée.
zsh
zsh
La=(...)
forme de substitution de processus utilise un fichier temporaire. Par exemple,=(echo test)
étend le chemin du fichier temporaire qui contienttest\n
.Ce fichier est automatiquement supprimé une fois la commande terminée.
bash / zsh sous Linux.
Here-files ou here-strings in
bash
etzsh
sont implémentés en tant que fichiers temporaires supprimés.Donc si vous le faites:
Le descripteur de fichier 3 est connecté à un fichier temporaire supprimé qui contient
test\n
.Vous pouvez obtenir son contenu avec:
Si vous êtes sous Linux, vous pouvez également lire ou écrire dans ce fichier via
/dev/fd/3
(Certains autres shells utilisent des pipes, ou peuvent utiliser
/dev/null
si la doc est vide).POSIX
Il n'y a pas d'
mktemp
utilitaire POSIX. Cependant, POSIX spécifie unemkstemp(template)
API C et l'm4
utilitaire standard expose cette API avec lamkstemp()
fonction m4 du même nom.mkstemp()
vous donne un nom de fichier avec une partie aléatoire dont il était garanti qu'elle n'existerait pas au moment où la fonction a été appelée. Il crée le fichier avec les autorisations 0600 sans aucune course.Donc, vous pourriez faire:
Notez toutefois que vous devez gérer le nettoyage à la sortie. Toutefois, si vous ne devez écrire et lire le fichier qu'un nombre fixe de fois, vous pouvez l'ouvrir et le supprimer juste après sa création, comme pour le fichier here-doc / here- approche de chaîne ci-dessus:
Vous pouvez ouvrir le fichier pour lecture une fois et
lseek()
revenir en arrière entre deux lectures. Cependant, aucun utilitaire POSIX ne peut effectuer ce rembobinage ( ), vous ne pouvez donc pas le faire de manière portable dans un script POSIX (zsh
(sysseek
intégré) etksh93
(<#((...))
opérateur)). faites le cependant).la source
<()
=(...)
.Voici une réponse légèrement améliorée dans la lignée de Hauke Laging:
la source
Mon flux de travail généralement avec des fichiers temporaires est dû à un script bash que je teste. Je veux que tout soit clair pour
tee
que je puisse voir que tout fonctionne et enregistrer la sortie pour la prochaine itération de mon processus. J'ai créé un fichier appelétmp
afin que je puisse l'utiliser comme
La raison pour laquelle j’aime le format de date et d’heure précédant les valeurs aléatoires, c’est que cela me permet de trouver facilement le fichier tmp que je viens de créer, et je n’ai pas à penser à comment le nommer la prochaine fois (et à me concentrer uniquement sur mon script dang travailler).
la source