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

Unix Discussion :

Shell double redirection


Sujet :

Unix

  1. #1
    Membre régulier
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut Shell double redirection
    Bonjour,

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

    Exemple qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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
    Membre régulier
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut
    Merci pour cette réponse matafan.

    Saurais tu comment rediriger cette information vers mon fichier txt ?

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre régulier
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    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.

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/02/2015, 21h52
  2. Double redirection (tordu)
    Par pimpmyride dans le forum Apache
    Réponses: 4
    Dernier message: 21/11/2012, 11h44
  3. [ shell UNIX ] redirection d'un resultat de tar
    Par donfab dans le forum Linux
    Réponses: 2
    Dernier message: 15/12/2007, 22h47
  4. [shell script] redirections multiples (mal gerées)
    Par frp31 dans le forum Administration système
    Réponses: 10
    Dernier message: 11/09/2007, 15h59
  5. [VB.NET]Double redirection.
    Par CammCamm dans le forum ASP.NET
    Réponses: 9
    Dernier message: 24/11/2003, 16h11

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