Partage
  • Partager sur Facebook
  • Partager sur Twitter

Shell-script problème

    23 janvier 2020 à 15:04:45

    Bonjour à tous !

    Je suis étudiant en dernière année de DUT Informatique et j’ai du mal à comprendre un sujet sur lequel j’essaie de m’entrainer pour mes partiels...

    Il m’est demandé de créer un shell script portant le nom que je veux et qui se présente ainsi :

    #!/bin/bash
    for NUMERO in ‘seq 1 1000’
    do
    echo Processus ${1} : Iteration numero ${NUMERO}
    sleep $((RANDOM%5))
    done

    Je dois éxécuter ce shell-script, par conséquent je modifie les permissions avec chmod +x nom_du_shell suivi de ./nom_du_shell

    Pour l’arrêter je fais un ctrl C. Mais j’ai l’impression que mon shell-script ne marche pas bien au vue du message retourné par mon terminal...

    Par la suite je dois aussi réaliser une exécution en parallèle dans la même fenêtre de 2 exemplaires du shell-script avec l’argument first pour le premier et second pour le deuxième, et là je suis complètement perdu. J’aurai fait ./nom_du_shell first et ./nom_du_shell second mais ça me semble bizarre. J’attends donc vos réactions sur ce sujet...

    Merci de votre aide :)

    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2020 à 15:52:54

      Salut,

      Que te retourne la console après avoir fait Ctrl+C ?

      Est-ce que tu vois bien au moins 1 echo ?

      • Partager sur Facebook
      • Partager sur Twitter

      Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

        23 janvier 2020 à 15:59:57

        Stvn Sbn a écrit:

        Salut,

        Que te retourne la console après avoir fait Ctrl+C ?

        Est-ce que tu vois bien au moins 1 echo ?

        Je fais ./nom_du_shell, et je ne peux pas faire ctrl C car il m’affiche directement Processus : Iteration numero seq 1 1000, une seule fois





        -
        Edité par AlbanLafont1 23 janvier 2020 à 16:01:38

        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2020 à 16:04:55

          Donc ton script s'exécute bien,

          Le truc c'est que déjà, je sais pas si c'est normal mais visiblement tu devrais avoir un paramètre qui n'est pas utilisé ?

          echo Processus ${1}


          Ensuite, si il affiche une seule fois ton echo c'est que y'a un problème dans ton sleep

          Tu peux développer cette partie ?

          sleep $((RANDOM%5))


          Je comprends pas trop le "RANDOM%5"

          Tu peux essayer en remplaçant par un nombre déjà dans un premier temps?

          -
          Edité par Andrøll 23 janvier 2020 à 16:08:14

          • Partager sur Facebook
          • Partager sur Twitter

          Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

            23 janvier 2020 à 16:10:18

            Le premier truc demandé c’est :  Executez le shell-script que vous venez de saisir.

            Et après : Arretez ce shell-script.

            Donc je suis pas certain qu’il faille modifier quelques choses, ou alors je comprends pas la démarche à suivre. C’est le 1er shell-script sur lequel je bosse donc je suis un peu perdu à vrai dire... :/

            • Partager sur Facebook
            • Partager sur Twitter
              23 janvier 2020 à 16:16:10

              Ah pardon j'avais pas compris qu'il fallait faire ça

              Et bien, tu exécutes bien ton script puisque tu as un echo qui se fait

              Puis, Ctrl+C va terminer la tâche en cours, en l’occurrence ton script et te ramène sur le prompt

              Si c'est le cas, c'est ok pour toi ;)

              • Partager sur Facebook
              • Partager sur Twitter

              Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

                23 janvier 2020 à 16:22:09

                Ok. :)

                Par contre pour la double execution je vois pas du tout le truc...

                • Partager sur Facebook
                • Partager sur Twitter
                  23 janvier 2020 à 16:25:48

                  Alors pour ça je t'avoue n'avoir absolument rien compris ^^'

                  Tu peux pas montrer directement ton énoncé ou ce que tu as à dispo ?

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

                    23 janvier 2020 à 19:18:21

                    parce que c'est un vieux sujet, l'énoncé utilise des ` pour réaliser une Substitution de commande, au lieu de $().

                    et tu les as interprété comme des apostrophes, le shell interprète ce texte comme une chaîne littérale, et non comme une commande à exécuter

                    -
                    Edité par dantonq 23 janvier 2020 à 19:41:56

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                      24 janvier 2020 à 9:22:55

                      Salut Dantonq

                      J'utilise toujours des `` pour exécuter les commandes et ça fonctionne pour moi :o mais merci de l'info !

                      Pourtant son echo se passe bien également non ?

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

                        24 janvier 2020 à 11:24:19

                        Bonjour,

                        Stvn Sbn a écrit:

                        Pourtant son echo se passe bien également non ?


                        Parce que utiliser des guillemets simple n'empêche pas l’exécution du script:

                        $ bash -x script.sh 
                        + for NUMERO in ‘seq 1 1000’
                        + echo Processus : Iteration numero ‘seq
                        Processus : Iteration numero ‘seq
                        + sleep 2
                        + for NUMERO in ‘seq 1 1000’
                        + echo Processus : Iteration numero 1
                        Processus : Iteration numero 1
                        + sleep 3
                        + for NUMERO in ‘seq 1 1000’
                        + echo Processus : Iteration numero 1000’
                        Processus : Iteration numero 1000’
                        + sleep 4
                        


                        EDIT: J'ai simplement copié collé le script posté par l'OP, mais avec des guillemets simple on a une seule itération de la boucle for avec comme valeur pour NUMERO : "seq 1 1000".

                        -
                        Edité par KoaTao 24 janvier 2020 à 11:26:54

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 janvier 2020 à 11:43:33

                          Bonjour,

                          ce qui me dérange c’est le fait de devoir éxécuter le shell-script et qu’on me demande par la suite de l’arrêter.

                          Après l’execution je n’ai même pas à l’arrêter étant donné que je n’ai même pas le temps de faire un ctrl C puisque je n’ai qu’un echo...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 janvier 2020 à 12:54:08

                            AlbanLafont1 a écrit:r.

                            Après l’execution je n’ai même pas à l’arrêter étant donné que je n’ai même pas le temps de faire un ctrl C puisque je n’ai qu’un echo...

                            C'est parce que tu ne fais pas assez de tour de boucle. Tu devrais avoir 1000 tours de boucles et chaque tour devrait prendre en moyenne 2 secondes, donc ton script devrait prendre environ 2000 secondes environ, ce qui te laisse le temps de faire ce que tu as à faire.

                            dantonq a écrit:

                            parce que c'est un vieux sujet, l'énoncé utilise des ` pour réaliser une Substitution de commande, au lieu de $().

                            et tu les as interprété comme des apostrophes, le shell interprète ce texte comme une chaîne littérale, et non comme une commande à exécuter

                            Tu as mal recopié le script, voilà tout.

                            Tu peux même utiliser une boucle for à la manière du C pour incrémenter ton compteur si c'est plus clair pour toi:

                            for ((numero = 1; numero <= 1000; numero++)); do
                                echo "$numero";
                                sleep $((RANDOM%5))
                            done



                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 janvier 2020 à 12:55:29

                              En plus de ne pas avoir écouté en cours,

                              - tu lis mal les énoncés

                              - tu ne lis pas les réponses qu'on te donne

                              C'est peut être les lunettes. Vois tu une différence entre ces deux lignes ?

                              for NUMERO in 'seq 1 1000'
                              for NUMERO in `seq 1 1000`



                              -
                              Edité par michelbillaud 24 janvier 2020 à 12:56:22

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 janvier 2020 à 13:44:02

                                Ah je n'avais même pas vu sa faute des guillemets en effet pardon

                                Pour info je reçois bientôt ma paire de lunette me concernant :lol:

                                En revanche pour la double exécution du 3.2.2, j'arrive pas à comprendre la demande :o

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Un bonjour, un s'il te plaît (stp accepté) et un merci ne font pas de mal

                                  24 janvier 2020 à 13:49:06

                                  michelbillaud a écrit:

                                  En plus de ne pas avoir écouté en cours,

                                  - tu lis mal les énoncés

                                  - tu ne lis pas les réponses qu'on te donne

                                  C'est peut être les lunettes. Vois tu une différence entre ces deux lignes ?

                                  for NUMERO in 'seq 1 1000'
                                  for NUMERO in `seq 1 1000`

                                  Je tiens à te tenir au courant que je suis actuellement 2ème de ma promo dans cette matière. Nous n’avons pas eu le temps de voir les shell-script en cours mais cela peut quand même tomber lors de mes partiels. J’aurai pu faire l’élève qui s’en moque et qui y va les mains dans les poches en faisant l’impasse, mais ce n’est pas mon cas. J’essaie d’apprendre auprès des gens qui veulent bien partager leurs savoirs en donnant des conseils, et non pas auprès de ceux qui se permettent de prendre de haut les autres. Alors merci de ne pas me manquer de respect car je ne suis qu’un «débutant»...

                                  -
                                  Edité par michelbillaud il y a 39 minutes



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 janvier 2020 à 14:20:10

                                    J'ai les mêmes (j'enseigne en iut info, justement), ici c'est enseigné au premier semestre  module m1101.

                                    En tout cas, c'est un sujet où il existe des bouquins et des ressources en ligne depuis des décennies (les informaticiens ayant été les premiers à mettre leurs cours sur internet).

                                    Donc

                                    Si on n'a pas eu de cours, en trouver. Et ne pas s'imaginer qu'on va résoudre les exercices en inventant soi même les connaissances.

                                    Lire attentivement  les réponses, quand on pose les questions.

                                    ---

                                    Pour lancer deux instances  en parallèle (Et en arrière plan)

                                    . /truc first &   ./truc second  &

                                    Quelqu'un a recommandé avec raison la forme $(commande),  qui est maintenant dans la norme posix (avant, c'etait spécifique à bash), ça a été inventé d'une part pour les problèmes de lisibilité, d'autre part pour permettre l'emboitement.

                                    -
                                    Edité par michelbillaud 24 janvier 2020 à 14:25:46

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Shell-script problème

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown