Ce n' $$ dans le shell?
Une fois, j'ai lu que la seule façon d'obtenir un nom de fichier unique dans un shell pour les fichiers temporaires a été d'utiliser un double signe de dollar ($$
). Ce n'produire un nombre qui varie de temps en temps... mais si vous l'appelez à plusieurs reprises, elle renvoie le même nombre. (La solution est d'utiliser le temps.)
Je suis curieux de savoir ce que $$
est réellement, et pourquoi il serait suggéré comme un moyen de générer un nom de fichier unique.
Vous devez vous connecter pour publier un commentaire.
En Bash
$$
est l'ID de processus, comme indiqué dans les commentaires il n'est pas sûr de l'utiliser comme un nom de fichier temp pour une variété de raisons.Pour les noms de fichiers temporaires, l'utilisation de la
mktemp
commande.git
semble utiliser$$
pour fusionner tempfiles$$
est l'ID de processus (PID) dans bash. À l'aide de$$
est une mauvaise idée, car cela va créer une situation de concurrence, et de permettre à votre shell-script pour être subverti par un attaquant. Voir, par exemple, tous les ces gens qui a créé l'insécurité des fichiers temporaires et a dû émettre des avis de sécurité.Au lieu de cela, utiliser
mktemp
. Le Linux page de man pour mktemp est excellent. Voici un exemple de code à partir d'elle:mktemp
option-t
est maintenant obsolète (je pense à cause de problèmes avec le char-
). Utilisationmktemp ${tempfoo}.XXXXXX
ces jours. Je prends la liberté de mettre à jour votre post.TMPFILE=$(mktemp)
à la place.$$ est l'id du processus courant.
Tous les processus dans UNIX comme système d'exploitation (temporairement) l'identificateur unique, le PID. Deux processus s'exécutent en même temps peut avoir le même PID, et $$ renvoie le PID du bash instance en cours d'exécution du script.
C'est très bien pas un unique idenifier dans le sens qu'il ne sera jamais réutilisé (en effet, les PIDs sont réutilisés en permanence). Ce qu'il vous donne est un nombre tel que, si une autre personne exécute votre script, vous obtiendrez un identifiant différent, tandis que le vôtre est toujours en cours d'exécution. Une fois que le vôtre meurt, le PID peut être recyclé et quelqu'un d'autre pourrait l'exécuter votre script, obtenir le même PID, et donc obtenir le même nom de fichier.
En tant que tel, il est vraiment sain d'esprit de dire "$$ donne un nom de fichier, de telle sorte que si quelqu'un d'autre s'exécute le même script whist mon exemple est toujours en cours d'exécution, vous obtiendrez un nom différent".
$$ est de votre PID. Il n'a pas vraiment de générer un nom de fichier unique, sauf si vous êtes prudent, et personne d'autre est-il exactement de la même manière.
En général, vous devez créer quelque chose comme /tmp/myprogramname$$
Qu'il y a autant de façons de briser ce, et si vous écrivez à des endroits autres gens peuvent écrire sur ce n'est pas trop difficile sur de nombreux Systèmes d'exploitation de prédire ce qui PID que vous allez avoir et de la vis autour de -- imaginez que vous êtes en cours d'exécution en tant que root et j'ai créer /tmp/yourprogname13395 comme un lien symbolique pointant vers /etc/passwd -- et vous écrivez en elle.
C'est une mauvaise chose à faire dans un script shell. Si vous allez utiliser un fichier temporaire pour quelque chose, vous devriez être en utilisant une meilleure langue dans laquelle au moins vous permettre d'ajouter le "exclusif" drapeau de l'ouverture (à créer) le fichier. Ensuite, vous pouvez être sûr que vous n'êtes pas casser quelque chose d'autre.
$$ est le pid du shell en cours de processus. Ce n'est pas un bon moyen pour générer un nom de fichier unique.
De $$ est l'id de processus du shell dans lequel votre script est en cours d'exécution. Pour plus de détails, voir la page de man pour sh ou bash. Les pages de manuel peuvent être trouvés se soit à l'aide d'une ligne de commande "man sh", ou par la recherche sur le web pour "shell man"
Permettez-moi de deuxième emk réponse -- n'utilisez pas de $$ par lui-même comme un "unique" quoi que ce soit. Pour les fichiers, utilisez mktemp. Pour d'autres Id dans le même script bash, utiliser "$$$(date +%s%N)" pour une raisonnablement de bonnes chances de l'unicité.
C'est l'ID de processus du processus bash. Aucun processus concurrent n'aura jamais la même valeur de PID.
$$ est le pid (process id) de la shell interprète l'exécution de votre script. C'est différent pour chaque processus en cours d'exécution sur un système à l'instant, mais au fil du temps le pid entoure, et après la sortie il y aura un autre processus avec le même pid par la suite.Tant que vous êtes en cours d'exécution, le pid est unique pour vous.
De la définition ci-dessus, il devrait être évident que, peu importe combien de fois vous utilisez $$ dans un script, il sera de retour le même nombre.
Vous pouvez utiliser, par exemple /tmp/myscript.de zéro.$$ en tant que votre fichier temporaire pour des choses qui n'ont pas besoin d'être extrêmement fiables et sûres. C'est une bonne pratique consiste à supprimer ces fichiers temporaires à la fin de votre script, en utilisant, par exemple, le piège de commande: