Pourquoi l'exécution de echo $$
dans bash
renvoie-t-elle un nombre tel que 7190
, alors que l'exécution de echo $
ne renvoie qu'un $
?
Convention.
$$
: étend à l'ID de processus du shell. Dans un sous-shell (), il se développe en identifiant de processus du Shell appelant, pas du sous-shell (voir le lien vers le manuel ci-dessous).
rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind 3244 3237 0 19:06 pts/0 00:00:00 /bin/bash
Très utile pour les logiciels de codage. Et il peut être utilisé comme un moyen brut (mktemp
serait la meilleure méthode) de créer des fichiers temporaires
1 $
n'a pas de signification particulière, il vous indique donc ce que fait toujours écho: le renvoyer.
Une page de manuel y est dédiée (3.4.2 Paramètres spéciaux).
Dans bash pour indiquer l'utilisation d'une variable, nous utilisons $
, en utilisant $$
avec le premier signe dollar, nous disons que je veux utiliser une variable et en utilisant la seconde, nous disons que le nom de cette variable est en fait un $
. c'est en fait une convention de nommage, et cette variable contient l'identifiant du processus du shell actuel.
Comme vous l'avez demandé dans les commentaires avec $$$$
, vous renvoyez le même identifiant de processus deux fois.
Il y a aussi d'autres variables (From here ):
$1
,$2
,$3
, ... sont les paramètres de position ."$@"
est une construction de type tableau de tous les paramètres de position,{$1, $2, $3 ...}
."$*"
est le développement IFS de tous les paramètres de position,$1 $2 $3 ...
.$#
est le nombre de paramètres de position.$-
options en cours définies pour le shell.$$
pid du shell actuel (pas du sous-shell).$_
paramètre le plus récent (ou le chemin abs de la commande permettant de démarrer le shell en cours immédiatement après le démarrage).$IFS
est le séparateur de champ (entrée).$?
est le dernier état de sortie du pipeline de premier plan.$!
est le PID de la commande d'arrière-plan la plus récente.$0
est le nom du shell ou du script shell.
Voici une application réelle de $$
tirée de Minuterie d’écran de verrouillage :
# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
kill "$PREVIOUS"
rm ~/.lock-screen-timer-remaining
zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi
Dans cet extrait de code, la ligne:
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy
utilise le processus en cours d'exécution ($$
) pour le supprimer (indiqué par not -v
) de la liste de tous les processus s'exécutant sous le même nom (lock-screen-timer
dans ce cas).
S'il y avait une copie en cours d'exécution précédente, le code le tue et supprime le fichier de travail qu'il utilisait.