web-dev-qa-db-fra.com

Pourquoi echo $$ renvoie-t-il un nombre?

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 $?

6
NerdOfLinux

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).

17
Rinzwind

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.
11
Ravexina

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.

1
WinEunuuchs2Unix