2017-09-12 16 views
0

J'utilise la commande suivante pour générer un identifiant unique pour mon script shell. Je veux capturer la sortie dans une variable sans utiliser de fichier intermédiaire sur le disque dur.bash: génération d'identifiant unique significatif

echo `dmidecode –t 4 -s system-uuid`-$$-$BASH_SUBSHELL-$BASHPID-`date '+%Y%m%d_%H%M_%S_%N'` | tr '-' '_' 
    XXB3A1XX_81XX_4XX2_AXX4_XXXX62820BF_24115_0_8550_201709XX_1446_46_385924883 

Je peux utiliser backquote ou $() construire mais cela change si la valeur de BASH_SUBSHELL $ et dilue la valeur de l'ID unique.

Toute solution est la bienvenue qui n'utilise pas de disque dur et ne modifie pas la valeur $ BASH_SUBSHELL lors de la capture de la sortie dans une variable.

Note: résultat dans l'exemple est en partie occultée par X

Répondre

1

Utilisez printf et enregistrer les variables dans une chaîne de format:

format="%s-$$-$BASH_SUBSHELL-$BASHPID-%s" 
uuid=$(printf "$format" $(dmidecode –t 4 -s system-uuid) $(date '+%Y%m%d_%H%M_%S_%N') | tr - _) 

Puis:

$ echo "$uuid" 
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_11764_0_11764_20170912_1906_42_765827138 
$ echo `dmidecode –t 4 -s system-uuid`-$$-$BASH_SUBSHELL-$BASHPID-`date '+%Y%m%d_%H%M_%S_%N'` | tr '-' '_' 
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_11764_0_11865_20170912_1909_28_405748643 
+0

nous pouvons voir $$ - $ BASH_SUBSHELL- $ BASHPID donne 3 valeurs uniques avec la valeur $ BASH_SUBSHELL conservée à 0 en cas d'écho direct. Mais avec la méthode ci-dessus nous obtenons seulement 2. L'entropie a été réduite !! –

+0

@thesudhakar bien, ce n'est pas un écho direct. Vous avez créé une fourchette lorsque vous avez utilisé un tuyau. En ce qui concerne l'entropie, je n'ai pas la moindre idée de la raison pour laquelle vous faites cela au lieu d'utiliser quelque chose comme ['uuidgen'] (http://man7.org/linux/man-pages/man1/uuidgen.1.html) ou Python pour créer de vrais UUID, donc je ne commenterai pas. – muru

+0

Je ne vois pas quel sens cette chose a, ou pourquoi elle doit avoir un sens quelconque. Comme pour le tuyau, quand vous faites 'foo | bar', bash bifurque et exécute 'foo' et' bar' indépendamment. Il n'y a pas de forking impliqué dans 'printf' car il n'y a pas de pipe et' printf' est un builtin. – muru