Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Nouveau Membre du Club
    Inscrit en
    octobre 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 87
    Points : 29
    Points
    29

    Par défaut Shell double redirection

    Bonjour,

    j'aimerai redirigeai les erreurs de mes commandes dans un shell.

    Exemple qui marche :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if mysql -pMotDePasse Base --exec="select nom from utilisateur;" 2>/tmp/error.txt; then
            echo ok
    else
            echo ko
            cat  /tmp/error.txt
    fi
     
    if mysql -pMotDePasse Base --exec="select nom2 from utilisateur;" 2>/tmp/error.txt; then
            echo ok
    else
            echo ko
            cat  /tmp/error.txt
    fi
    Résultat :
    +--------------+
    | nom |
    +--------------+
    | USER1 |
    | USER2 |
    +--------------+
    ok
    ko
    ERROR 1054 (42S22) at line 1: Unknown column 'nom2' in 'field list'

    Mais pour cet exemple ça ne marche pas :
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    if mysql -pdamien ged < /t/tutu 2>/tmp/error.txt; then
            echo ok
    else
            echo ko
            cat  /tmp/error.txt
    fi
    Résultat :
    ./testScript.sh: line 92: /t/tutu: Aucun fichier ou dossier de ce type
    ko
    ERROR 1054 (42S22) at line 1: Unknown column 'nom2' in 'field list'

    L'erreur est directement écrite dans la console et pas redirigé vers mon fichier d'erreur. Du coup c'est l'erreur précédente qui est affichée.

    Je pense que le problème vient du fait que j'insère des données avec '<' dans la bdd et qu'ensuite je veux rediriger une erreur potentielle dans mon fichier texte avec '>' sur une même ligne.

    Savez vous comment contourner ce soucis ?

    Par avance merci,

    Damien.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2008
    Messages
    1 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 514
    Points : 2 232
    Points
    2 232

    Par défaut

    Citation Envoyé par Sango64 Voir le message
    Je pense que le problème vient du fait que j'insère des données avec '<' dans la bdd et qu'ensuite je veux rediriger une erreur potentielle dans mon fichier texte avec '>' sur une même ligne.
    Non, l'erreur vient du fait que le fichier /t/tutu n'existe pas. Le message d'erreur que tu vois ("... Aucun fichier ou dossier de ce type") est affiché par le shell, pas par la commande mysql, et la redirection "2>/tmp/error.txt" n'a donc aucun effet.

    Par contre comme tu peux le constater, l'erreur "ERROR 1054 ...", qui est générée par la commande mysql, est bien redirigée dans /tmp/error.txt.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    octobre 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 87
    Points : 29
    Points
    29

    Par défaut

    Merci pour cette réponse matafan.

    Saurais tu comment rediriger cette information vers mon fichier txt ?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2008
    Messages
    1 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 514
    Points : 2 232
    Points
    2 232

    Par défaut

    Tu peux faire :
    Code :
    1
    2
    3
    4
    5
    6
    if { mysql -pdamien ged < /t/tutu; } 2>/tmp/error.txt; then
            echo ok
    else
            echo ko
            cat  /tmp/error.txt
    fi
    Une autre solution serait de rediriger carrément la sortie d'erreur de ton shell vers /tmp/error.txt :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    exec 2>/tmp/error.txt
     
    if mysql -pdamien ged < /t/tutu; then
            echo ok
    else
            echo ko
            cat  /tmp/error.txt
    fi
    Un point sans rapport avec ta questions : il est extrêmement dangereux d'aller écrire dans un fichier de /tmp sans prendre de grandes précautions. Imagine qu'un utilisateur non privilégié créé un lien symbolique /tmp/error.txt vers un fichier sur lequel il na pas les droits d'écritures, mais sur lequel la personne qui lance ton script a les droits d'écriture. A l'exécution du script, le fichier cible sera écrasé.

  5. #5
    Nouveau Membre du Club
    Inscrit en
    octobre 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 87
    Points : 29
    Points
    29

    Par défaut

    Bonjour matafan,

    Merci beaucoup pour ces bons conseils et désolé de te répondre que maintenant, ça fonctionne très bien.
    Je ne connaissais pas la syntaxe avec les '{' '}'.

    Mon script sera exécuté une fois lors de l'installation d'une machine, il sera par la suite supprimé (avec le fichier d'erreur) de cette machine et donc non réutilisable.
    Mais je prends en compte ta remarque pour les autres scripts que je pourrai faire

    Au plaisir.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •