Forum Astuces.divers [Terminal] debug de scripts bash

Posté par  .
Étiquettes : aucune
0
24
juil.
2002
Lorsque l'on programme en bash, il y a des options en ligne de commande pour voir ce qui est lu puis exécuter dans un script... Exemple :

Soit le script MyScript.sh :
   #!/bin/sh
   touch unFichier
   if [ -f ./unFichier ]; then
     rm ./unFichier
   fi

Si on l'exécute ainsi :
# /bin/bash -v -x ./MyScript.sh

On va avoir une sortie comme ça :
   #!/bin/sh
   touch unFichier
   + touch unFichier
   if [ -f ./unFichier ]; then
     rm ./unFichier
   fi
   + '['-f ./unFichier ']'
   + rm ./unFichier


Les lignes normales sont les lignes et blocs lus, tandis que celles avec un + devant sont celles exécutées.
  • # gruiiikkk

    Posté par  . Évalué à 1.

    faut faire court .. ca passe en page principale!!
  • # Autre forme d'appel pour le debug

    Posté par  . Évalué à 1.

    Ajouter en debut de script la ligne suivante:

    set -xv

    Donc par exemple:
    #!/bin/bash
    set -xv
    touch unFichier
    if [ -f ./unFichier ]; then
    rm ./unFichier
    fi
  • # Re: debug de scripts bash

    Posté par  . Évalué à 2.

    Bon j'y vais de mon astuce aussi.

    hypothese: vous ecrivez un script qui doit renomer/deplacer/effacer des fichiers, bref qui est dangereux pour les datas si ca se passe mal.

    mon idée: remplacez les appels a "rm" "mv" "cp" ... en placant un "echo" devant.

    ca donne: monscript.sh
    #!/bin/bash
    ls | while read FILE
    do
    if ......
    then
    echo "rm $FILE"
    fi
    done

    vous le lancez tel quel, tous les "rm /tmp/pipo/..." s'affiichent a l'ecran pour visualisation et si c'est bien ce qui était souhaité, vous relancez le script en
    pipant la sortie dans un shell:
    ./monscript.sh | /bin/sh

    chez moi ca evite pas mal de problemes liées aux fotes de phrapes ;-)
    • [^] # Re: debug de scripts bash

      Posté par  (site Web personnel) . Évalué à 1.

      Oui, mais où est l'asstuce ? Tu aurais donné en plus une ligne de commande qui remplace toutes les occurences de "rm, mv, cp" par "echo " commande ", d'accord. Mais là, c'est un peu creux.
      • [^] # Re: debug de scripts bash

        Posté par  . Évalué à 1.

        On peut le voir comme ca, mais l'astuce c'est que tu code TOUJOURS avec un echo devant et que tu n'as pas besoin de l'enlever quand tui es sur du resultat puisque - si tu lis jusqu'a la fin de mon message - tu pipe le tout dans un autre shell (astuce).

        en clair, au premier lancement tu te retrouve avec
        #/tmp/monshell.sh
        rm /tmp/pipo1
        rm /tmp/pipo2
        mv /tmp/pipo1.gif /tmp/pipo3.txt

        si ca te plait , tu le lance en demandant d'effectuer les operations avec un pipe comme ca:
        #/tmp/monshell.sh | /bin/sh

        capté ?
        • [^] # Re: debug de scripts bash

          Posté par  (site Web personnel) . Évalué à 1.

          Oui, m'enfin ce n'est pas une astuce au sens où on peut l'entendre pour la boite de DLFP. Habituellement, on y trouve plus des façons d'exploiter les capacités de tel ou tel logiciel...

          Pour ce que tu présentes, il s'agit plutot d'une technique de programmation. Au passage, bien qu'assez pratique, cette technique est discutable, surtout si on cherche à la généraliser. En effet, plus une technique de déboggage est intrusive mois elle est bonne...

          De ce point de vue, celle que tu présentes est à éviter lorsqu'on peut se débrouiller autrement. Tout dépend bien s^ur de ce que l'on souhaite faire, mais c'est une mauvaise idée de la généraliser.
          • [^] # Re: debug de scripts bash

            Posté par  . Évalué à 1.

            Non, je fais la même chose quand je dois déplacer, renommer bcp de fichiers et que c'est un peu dangereux.

            La technique est excellente. Tu vérifies les commandes qui vont être executés et quand tu es sûr de toi, tu execute grace au pipe
        • [^] # Re: debug de scripts bash

          Posté par  . Évalué à 1.

          Mieux que cela, il est aussi possible d'appeler le bash avec l'option -vn Exemple : tmp.sh #!/bin/bash touch toto rm toto $ bash -vn tmp.sh Cela ne va rien executer, mais juste afficher les lignes qui auraient dû l'être. Attention à ne pas lancer la commande set -n pour tester sur un terminal. En effet, elle dit au bash de lire les commandes sans les executer. Donc votre shell deviendra inutile. Même la commande set +n ne vous redonnera pas la main :)
          • [^] # Re: debug de scripts bash

            Posté par  (site Web personnel) . Évalué à 1.

            >Attention à ne pas lancer la commande set -n pour tester sur un terminal. En >effet, elle dit au bash de lire les commandes sans les executer. Donc votre shell >deviendra inutile. Même la commande set +n ne vous redonnera pas la main :)

            cela n'est pas [plus] vrai avec la version 2.05b de bash
          • [^] # Re: debug de scripts bash

            Posté par  . Évalué à 1.

            Mais c'est excellent tout plein cette option!
            Je mets ca dans un coin de ma mémoire, ca resservira surement!

            "Il faut" (Ezekiel 18:4) "forniquer" (Corinthiens 6:9, 10) "avec des chiens" (Thessaloniciens 1:6-9) "morts" (Timothée 3:1-10).

      • [^] # Re: debug de scripts bash

        Posté par  . Évalué à 1.

        Quand je programme directement sur la ligne de commande, j'utilise cette technique. Quand je fais un script que je veux pouvoir débogguer facilement (ou lancer de temps à autre en étant sur de ne rien cassé), j'ai quelques techniques simples:
        # SHOW est choisi (par édition ou avec une option quelconque)
        # Ici on débug
        SHOW=echo
        # ici on fait l'opération
        SHOW=
        # et après, pour les étapes dangeureuses :
        $SHOW rm  ...
        $SHOW mv ...
        
        Dans le même ordre d'idée, j'ai aussi :
        run() {
            if [ "$verbose" = 1 ]; then
                echo -n "Running:"
                for arg; do
                    echo -n " '$arg'"
                done
                echo
            fi
            "$@"
        }
        
  • # débuggage partiel

    Posté par  (site Web personnel) . Évalué à 1.

    On peut aussi vouloir seulement inspecter une partie du code, surtout dans le cas de script long ... histoire d'épargner un peu la molette ;)

    Pour ça, il y a la commande set, exemple :

    #!/bin/sh

    # [ BLABLA 100 lignes de la mort qui tuent mais qui marchent nickel ]

    # partie sensible :
    set -x; set -v

    touch unFichier
    if [ -f ./unFichier ]; then
    rm ./unFichier
    fi

    set +x; set+v

    # [ RE BLABLA ... ]

    exit 0;

    P.S. : c'est quoi les tags pour faire des boites de code ? Et c'est quoi les autres tags tiens tant qu'on y est

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.