Précédent   Forum du club des développeurs et IT Pro > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/11/2011, 11h38   #1
Sango64
Membre à l'essai
 
Inscription : octobre 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 73
Points : 24
Points : 24
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.
Sango64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 14h45   #2
matafan
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

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

Informations forums :
Inscription : octobre 2008
Messages : 1 482
Points : 2 438
Points : 2 438
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.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 10h06   #3
Sango64
Membre à l'essai
 
Inscription : octobre 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 73
Points : 24
Points : 24
Merci pour cette réponse matafan.

Saurais tu comment rediriger cette information vers mon fichier txt ?
Sango64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 14h55   #4
matafan
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

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

Informations forums :
Inscription : octobre 2008
Messages : 1 482
Points : 2 438
Points : 2 438
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é.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 09h37   #5
Sango64
Membre à l'essai
 
Inscription : octobre 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 73
Points : 24
Points : 24
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.
Sango64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h41.


 
 
 
 
Partenaires

Hébergement Web