Sous shell lorsqu'on fait un pipe?

gnugo -  
 gnugo -
Bonjour,
j'ai un problème que je ne parviens pas à comprendre ni à résoudre:

Quand je fais des:
echo $RANDOM
j'obtiens des nombres différents à chaque éxécution.

Par contre en faisant:
echo $RANDOM | cat
j'obtiens toujours le même résultat ( qui correspond au prochain "echo $RANDOM" dans mon shell )

j'en déduis que chaque "echo $RANDOM | cat" crée un sous-shell à chaque fois, tous dans le même état que mon shell actif, donc j'obtiens toujours le même nombre qui est le prochain de mon shell actif...)

Comment cela se fait il?
Comment, en ligne de commande, remédier au problème et envoyer à chaque exécution des valeurs différentes de $RANDOM dans un pipe ?

merci d'avance!

9 réponses

  1. gnugo
     
    J'ai créé un script "essai.sh" pour tester:
    #!/bin/bash
    echo $RANDOM
    echo $RANDOM
    echo $RANDOM | cat
    echo $RANDOM | cat
    echo $RANDOM
    echo $RANDOM


    Et voici le résultat que j'obtiens:
    $ ./essai.sh 
    1662
    10022
    6291
    6291
    6291
    10791
    1
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Idem pour moi, comme mes collègues mamiemando et dubcek, pas de problème ;-)

    Est-ce qu'avec "cat <<<$RANDOM" à la place de "echo $RANDOM | cat" tu as toujours le même résultat ?
    1
    1. gnugo
       
      Normalement cat <<<$RANDOM devrait me donner des résultats différents...mais vu mes résultats avec echo $RANDOM | cat , je commence à douter....réponse lundi sur le PC en question!

      (Merci!)
      0
  3. mamiemando Messages postés 33173 Date d'inscription   Statut Modérateur Dernière intervention   7 945
     
    Une méthode plus violente qui pourrait marcher et basée sur /dev/random :
    http://www.christopher.compagnon.name/sitewww/shell-gennumber.html

    .. car pour moi la réinitialisation de $RANDOM dépend de ton shell, tandis que /dev/random est gérée par des couches plus basses.

    Bonne chance
    1
  4. mamiemando Messages postés 33173 Date d'inscription   Statut Modérateur Dernière intervention   7 945
     
    Pour ma part :

    (mando@aldur) (~) $ echo $RANDOM
    26483
    (mando@aldur) (~) $ echo $RANDOM
    22861
    (mando@aldur) (~) $ echo $RANDOM | cat
    32160
    (mando@aldur) (~) $ echo $RANDOM | cat
    16745
    (mando@aldur) (~) $ echo $RANDOM | cat
    15298


    Du coup je n'ai pas compris le problème.
    0
    1. gnugo
       
      Je n'obtiens pas la même chose que toi, les "echo $RANDOM | cat" me donnent toujours la même valeur.
      Mon shell :/bin/bash, j'obtiens la même chose avec /bin/sh
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    j'ai des résultats différents
    $ cat f1
    #!/bin/bash
    
    echo $RANDOM
    echo $RANDOM
    echo $RANDOM | cat
    echo $RANDOM | cat
    echo $RANDOM
    echo $RANDOM
    
    $ ./f1
    5393
    14970
    816
    27615
    9518
    31088
    $ 
    
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    autre exemple
    $ seq 1 10 | xargs -L1 bash -c "echo $RANDOM"
    7593
    7593
    7593
    7593
    7593
    7593
    7593
    7593
    7593
    7593
    $ 
    $ seq 1 10 | xargs -L1 bash -c 'echo $RANDOM'
    8097
    13743
    12160
    24067
    17692
    28401
    15929
    2341
    31589
    7570
    $ 
    
    0
    1. Flachy Joe Messages postés 2303 Statut Membre 261
       
      Là c'est plutôt normal :
      - dans le premier cas la chaîne entre guillemets est interprété une seule fois par le shell puis passé à bash qui reçoit alors toujours la même chaîne.
      - alors que dans le second cas elle n'est pas interprété par le shell mais par le bash appelé.
      0
  8. gnugo
     
    cat <<<$RANDOM me donne également le même résultat à chaque fois!!

    En fait j'ai posté ici pour essayer de comprendre pourquoi mon shell agit de cette façon, mais oui je pourrais m'en sortir avec /dev/random ou autre.

    Auriez vous une idée de ce qui pourrait causer ces résultats? Je ne trouve pas:\
    0
  9. gnugo
     
    Je viens de m'apercevoir que quand je lance un nouveau shell, cela fonctionne! j'ai bien des résultats différents!
    Par contre des que je fais un simple echo $RANDOM, je reviens à ma situation anormale!

    Voyez vous même...

    essai.sh
    #!/bin/bash
    
    cat <<<$RANDOM
    cat <<<$RANDOM
    cat <<<$RANDOM
    echo $RANDOM
    echo $RANDOM
    cat <<<$RANDOM
    cat <<<$RANDOM
    cat <<<$RANDOM
    
    $ ./essai.sh 
    12634
    387
    31718
    16059
    7528
    21592
    21592
    21592


    essai2.sh
    #!/bin/bash
    
    echo $RANDOM | cat
    echo $RANDOM | cat
    echo $RANDOM | cat
    echo $RANDOM
    echo $RANDOM
    echo $RANDOM | cat
    echo $RANDOM | cat
    echo $RANDOM | cat
    
    $ ./essai2.sh 
    32552
    31451
    18744
    16255
    16297
    11011
    11011
    11011


    Comment est-ce possible?
    Avez vous les mêmes résultats ?
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    quelle version du shell ?
    bash --version
    0
    1. gnugo
       
      3.2.25(1)-release (i686-redhat-linux-gnu)
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      j'ai
      $ bash --version
      GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)

      peut-être une explication
      0
    3. mamiemando Messages postés 33173 Date d'inscription   Statut Modérateur Dernière intervention   7 945
       
      Même version que dubcek en ce qui me concerne. C'est pour ça que je t'invite à utiliser une solution basée sur /dev/random plutôt que $RANDOM qui est dépendant du shell (ici la version).
      0
    4. gnugo
       
      J'ai mis à jour bash et le problème persiste, ça ne vient pas de là à mon avis!

      Je précise que je cherche à trouver la cause de cette anomalie avec $RANDOM, je sais bien que pour générer des nombres aléatoires, il y a plein d'autres solutions qui fonctionnent.
      0