IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Utilisation commande Set


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation commande Set
    Bonjour,

    Je viens de voir que c'était une bonne pratique d'utiliser set -eu -o pipefail

    J'ai trouvé sur le net une page explicative (https://ss64.com/bash/set.html)

    Mais je ne suis pas bien sûr de comprendre:

    L'option e va permettre d'arreter tout de suite le script si une commande retoune un code erreur

    L'option u va traiter les variables non definies (exemple: test) comme une erreur et va interrompre l'exécution du script

    par contre c'est beaucoup moins clair pour l'option -o pipefail

    Quelqu'un pourrait m'expliquer?

    Merci par avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Bonjour,

    L'option -o pipefail permet de faire suivre le premier code d'erreur retourné par une commande à l'intérieur d'une série de pipe.
    Sans lui, c'est la valeur de retour de la dernière commande du pipe qui est retournée

    Exemple où cmd1 retourne le code d'erreur et cmd2 retourne 0 (pas d'erreur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set +o pipefail
    cmd1 | cmd2 
    echo $? // retourne 0
     
    set -o pipefail
    cmd1 | cmd2 
    echo $? // retourne 3
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour al1_24,
    Merci pour la réponse.
    D'accord si je comprends bien c'est pour prendre en compte toutes les erreurs qui pourraient arriver car si plusieurs commandes sont séparées par un pipe une commande pourrait ne pas marcher mais la seconde si, et on ne verrait pas l'erreur.

    Est-ce que c'est une bonne méthode de mettre au début d'un script où ce n'est utile que pour le débug?
    Est-ce qu'il y a d'autres possibilités pour faire du traitement d'erreurs?

    Merci par avance

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Lorsqu'on enchaine des commandes par un pipe il est avisé d'utiliser l'option pipefail pour ne pas risquer de laisser passer une erreur d'exécution.

    En revanche, l'utilisation de l'option errexit est plus contraignante car elle empêche l'utilisation de lignes de commande qui pourraient tomber en erreur sans compromettre l'avancement du script.

    L'utilisation de l'option nounset est une sécurité lors de la phase de mise au point.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chemin="$HOME"
    rm -rf $Chemin/*


    Les deux options qui sont vraiment utiles pour le débogage sont verbose et xtrace (-v et -x) car elles permettent de suivre pas à pas l'exécution du script et l'expansion des variables.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup pour ces élements.

    Par exemple j'ai essayé de mettre dans mon script en debut de fichier: set -eu -o pipefail

    mais le script s'arrete presque tout de suite est note: nohup ignoring input and appending output to 'nohup.out'

    Que dois-je comprendre que mon script à un problème?
    (il marche très bien sans la commande set)

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par flash026 Voir le message
    le script s'arrete presque tout de suite est note: nohup ignoring input and appending output to 'nohup.out'
    Pourrais-tu nous montrer la ligne de commande qui provoque l'erreur ? (voire accompagnée de quelques lignes de contexte)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Jack-ft,

    J'ai trouvé le problème j'avais dans le code écrit un endroit où il était "nohup", que pourtant je n'avais jamais écris....
    Je l'ai enlevé et ça a fonctionné ou presque car la commande set a fait son job en arrêtant l’exécution du script suite à une variable non définie.

    Par contre je me pose une question:
    dans mon script principal, j'ai mis au début la commande: set -eu -o pipefail et dans ce fichier j’appelle des fonctions dans d'autres fichiers. Est-ce que je dois mettre aussi dans les fonctions la commande set ou la commande set du script principal va aussi gérer les fichiers appelés.

    Bonne journée

Discussions similaires

  1. [Batch] Utilisation de %%x dans une commande set
    Par lxl77 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 14/06/2019, 17h17
  2. Utilisation des set
    Par Ikit dans le forum C++
    Réponses: 16
    Dernier message: 22/11/2006, 16h12
  3. Utilisation des sets
    Par Original Prankster dans le forum SL & STL
    Réponses: 6
    Dernier message: 08/02/2006, 21h28
  4. utiliser les set en C++
    Par yaskiki dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2005, 16h04
  5. utilisation de set locale
    Par ColonelHati dans le forum C
    Réponses: 7
    Dernier message: 02/05/2005, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo