157 votes

Que signifie $$$ dans la coquille ?

J'ai lu une fois qu'une façon d'obtenir un nom de fichier unique dans un shell pour les fichiers temporaires était d'utiliser un double signe dollar ( $$ ). Cela produit un nombre qui varie de temps en temps... mais si vous l'appelez à plusieurs reprises, il renvoie le même nombre. (La solution est d'utiliser simplement l'heure).

Je suis curieux de savoir ce que $$ et pourquoi elle est suggérée comme moyen de générer des noms de fichiers uniques.

123voto

emk Points 27772

$$ est l'ID du processus (PID) dans bash. Utilisation de $$ est une mauvaise idée, car cela créera généralement une condition de course, et permettra à votre shell-script d'être subverti par un attaquant. Voir, par exemple, tous les ces personnes qui ont créé des fichiers temporaires non sécurisés et ont dû émettre des avis de sécurité.

Au lieu de cela, utilisez mktemp . Le site Page de manuel Linux pour mktemp est excellent. Voici quelques exemples de code qu'il contient :

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE

3 votes

Merci. Le site mktemp option -t est maintenant déprécié (je pense que cela est dû à des problèmes avec le char - ). Utilisez mktemp ${tempfoo}.XXXXXX ces jours-ci . Je me permets de mettre à jour votre poste.

2 votes

Veuillez également noter que le backtick a été déprécié donc utiliser TMPFILE=$(mktemp) à la place.

111voto

Joe Skora Points 6535

Dans Bash $$ est l'ID du processus, comme indiqué dans les commentaires, il n'est pas sûr à utiliser comme nom de fichier temporaire pour une variété de raisons.

Pour les noms de fichiers temporaires, utilisez l'option mktemp commandement.

38 votes

Pour les personnes qui ne regardent que la réponse du haut, $$ n'est pas bien pour même un seul fichier si l'on écrit dans un répertoire accessible au public (par exemple, /tmp). Il est facile de joncher /tmp de liens symboliques qui feront que votre script écrira quelque part d'indésirable. mktemp est bien meilleur.

5 votes

Oui, l'utilisation de $$ causera une méchante faille de sécurité. Ne le faites pas.

8 votes

Ou la personne qui a posé la question devrait définir la réponse la mieux notée ci-dessous comme la réponse acceptée...

23voto

Flint Points 257

$$ est l'identifiant du processus en cours.

8voto

Adam Wright Points 31715

Chaque processus dans un système d'exploitation de type UNIX possède un identifiant unique (temporaire), le PID. Deux processus s'exécutant en même temps ne peuvent pas avoir le même PID, et $$ fait référence au PID de l'instance bash exécutant le script.

C'est très pas un identifiant unique dans le sens où il ne sera jamais réutilisé (en effet, les PID sont constamment réutilisés). Ce qu'il vous donne est un nombre tel que, si une autre personne exécute votre script, elle obtiendra un identifiant différent alors 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 exécuter votre script, obtenir le même PID, et ainsi obtenir le même nom de fichier.

En tant que tel, il est seulement 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 obtiendra un nom différent".

5voto

JBB Points 2013

$$$ est votre PID. Cela 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.

Typiquement, vous créez quelque chose comme /tmp/myprogramname$$.

Il y a tellement de façons de casser cela, et si vous écrivez à 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 faire des bêtises -- imaginez que vous vous exécutez en tant que Root et que je crée /tmp/votreprogname13395 comme un lien symbolique pointant vers /etc/passwd -- et que vous écrivez dedans.

C'est une mauvaise chose à faire dans un shell script. Si vous devez utiliser un fichier temporaire pour quelque chose, vous devriez utiliser un meilleur langage qui vous permettra au moins d'ajouter le drapeau "exclusif" pour ouvrir (créer) le fichier. Ainsi, vous pouvez être sûr que vous n'êtes pas en train d'endommager quelque chose d'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X