#!/bin/bash
# rnd.sh : Affiche un nombre aléatoire de dix chiffres

# Script de Stephane Chazelas.

head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'


# =================================================================== #

# Analyse
# -------

# head:
# -c4 prend les quatre premiers octets.

# od:
# -N4 limite la sortie à quatre octets.
# -tu4 sélectionne le format de sortie décimal non-signé.

# sed: 
# -n , combiné avec le drapeau "p" de la commande "s",
# n'affiche que les lignes correspondantes.



# L'auteur explique ci-après le fonctionnement de 'sed'.

# head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'
# ----------------------------------> |

# On dit que ce que l'on va --------> |
# envoyer à "sed" ------------------> |
# est 0000000 1198195154\n ---------> |

# sed commence par lire les caractères: 0000000 1198195154\n.
# Ici, il trouve un caractère de saut de ligne,
# donc il est prêt pour commencer à s'occuper de la première ligne (0000000 1198195154).
# Il regarde ses &lt;intervalle&gt;&lt;action&gt;s. La première est

#   intervalle  action
#   1           s/.* //p

# Le numéro de ligne est dans l'échelle, donc il exécute l'action :
# essaie de substituer la chaîne la plus longue finissant avec une espace dans la ligne
# ("0000000 ") avec rien (//), et s'il réussit, affiche le résultat
# ("p" est une option à la commande "s", c'est différent de la commande "p").

# sed est maintenant prêt à continuer la lecture de son entrée.
# (Notez qu'avant de continuer, si l'option -n n'a pas été fournie,
# sed aurait affiché de nouveau la ligne).

# Maintenant, sed lit le reste des caractères et trouve la fin du fichier.
# Il est maintenant prêt à traiter la deuxième ligne (qui est aussi numérotée
# '$' comme la dernière).
# Il voit qu'elle ne correspond pas à &lt;intervalle&gt;, donc son travail est terminé.

# En quelques mots, cette commande sed signifie :
# "Sur la première uniquement, supprime tout caractère jusqu'à l'espace le plus à droite,
# puis affiche-le."

# Une meilleure façon d'y parvenir aurait été :
#           sed -e 's/.* //;q'

# Ici, deux &lt;intervalle&gt;&lt;action&gt;s pourraient avoir été écrit
#           sed -e 's/.* //' -e q):

#   intervalle                     action
#   rien (correspond à la ligne)   s/.* //
#   rien (correspond à la ligne)   q (quit)

# Ici, sed lit seulement la première ligne en entrée.
# Il réalise les deux actions et affiche la ligne (substituée) avant de quitter
# (à cause de l'action "q") car l'option "-n" n'est pas passée.

# =================================================================== #

# Une alternative plus simple au script d'une ligne ci-dessus serait :
#           head -c4 /dev/urandom| od -An -tu4

exit 0
