Une fois, j’avais lu qu’une façon d’obtenir un nom de fichier unique dans un shell pour les fichiers temporaires consistait à utiliser un double signe dollar ($$
). Cela produit un nombre qui varie de temps en temps ... mais si vous l'appelez à plusieurs reprises, le même numéro est renvoyé. (La solution consiste simplement à utiliser le temps.)
Je suis curieux de savoir ce que $$
est réellement et pourquoi cela serait suggéré comme moyen de générer des noms de fichiers uniques.
Dans Bash, $$
correspond à l'ID du processus. Comme indiqué dans les commentaires, il n'est pas sûr de l'utiliser comme nom de fichier temporaire pour diverses raisons.
Pour les noms de fichiers temporaires, utilisez la commande mktemp
.
$$
est l'ID de processus (PID) dans bash. Utiliser $$
est une mauvaise idée, car cela créera généralement une situation de concurrence critique et permettra à votre script Shell d'être subverti par un attaquant. Voir, par exemple, tous ces personnes qui ont créé des fichiers temporaires non sécurisés et qui ont dû émettre des avis de sécurité.
Utilisez plutôt mktemp
. La page de manuel Linux de mktemp est excellente. Voici quelques exemples de code:
tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
$$ est l'id du processus en cours.
Chaque processus dans un système d'exploitation de type UNIX a un identifiant unique (temporaire), le PID. Deux processus en cours d'exécution simultanément ne peuvent avoir le même PID, et $$ fait référence au PID de l'instance bash exécutant le script.
C'est vraiment pas un identifiant unique en ce sens qu'il ne sera jamais réutilisé (en effet, les PID sont réutilisés en permanence). Cela vous donne un numéro tel que, si une autre personne exécute votre script, elle recevra un identifiant différent tant que le vôtre est en cours d'exécution. Une fois que le vôtre meurt, le PID peut être recyclé et quelqu'un d'autre peut exécuter votre script, obtenir le même PID et obtenir ainsi le même nom de fichier.
En tant que tel, il est donc vraiment sain de dire "$$ donne un nom de fichier tel que si quelqu'un d'autre exécute le même script alors que mon instance est toujours en cours d'exécution, il recevra un nom différent".
$$ est votre PID. Il ne génère pas vraiment un nom de fichier unique, à moins que vous ne soyez prudent et que personne d'autre ne le fasse exactement de la même manière.
Généralement, vous créez quelque chose comme/tmp/myprogramname $$
Il existe de nombreuses façons de résoudre ce problème, et si vous écrivez dans des endroits où d'autres personnes peuvent écrire, il n'est pas trop difficile, sur de nombreux systèmes d'exploitation, de prédire quel PID vous allez avoir et de vous foutre en l'air. en tant que root et je crée/tmp/votreprogname13395 en tant que lien symbolique pointant vers/etc/passwd - et vous y écrivez.
C'est une mauvaise chose à faire dans un script shell. Si vous allez utiliser un fichier temporaire pour quelque chose, vous devriez utiliser un meilleur langage qui vous laissera au moins ajouter l'indicateur "exclusif" pour ouvrir (créer) le fichier. Ensuite, vous pouvez être sûr que vous ne sabotez pas autre chose.
Permettez-moi de revenir sur la réponse d'Emk - n'utilisez pas $$ en tant que "chose unique". Pour les fichiers, utilisez mktemp. Pour les autres identifiants dans le même script bash, utilisez "$$$ (date +% s% N)" pour une raisonnablement bonne chance d'unicité.
-k
$$ est le pid du processus Shell en cours. Ce n'est pas un bon moyen de générer des noms de fichiers uniques.
Le $$ est l'identifiant du processus du Shell dans lequel votre script est en cours d'exécution. Pour plus de détails, voir la page de manuel sh ou bash. Les pages de manuel peuvent être trouvées en utilisant la ligne de commande "man sh" ou en cherchant sur le Web la "page de manuel Shell"
C'est l'identifiant du processus bash. Aucun processus simultané n'aura jamais le même PID.
$$ est le pid (id de processus) de l'interpréteur Shell exécutant votre script. C’est différent pour chaque processus exécuté sur un système à l’heure actuelle, mais avec le temps, le pid s’enroule autour de vous et, une fois que vous quittez, il y aura un autre processus avec le même pid. Le pid est unique en son genre.
D'après la définition ci-dessus, il devrait être évident que, peu importe le nombre de fois que vous utilisez $$ dans un script, celui-ci renverra le même nombre.
Vous pouvez utiliser, par exemple /tmp/myscript.scratch.$$ comme fichier temporaire pour tout ce qui n’est pas nécessairement extrêmement fiable ou sécurisé. Il est recommandé de supprimer ces fichiers temporaires à la fin de votre script, en utilisant, par exemple, la commande trap:
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
En outre, vous pouvez récupérer le nom d'utilisateur de connexion via cette commande. Par exemple.
echo $(</proc/$$/login id). After that, you need to use getent command.