Récupérer erreurs sql dans un script shell

Fermé
notkinvi - 5 sept. 2008 à 23:39
 notkinvi - 7 sept. 2008 à 02:52
Bonjour,

Je viens solliciter votre aider pour finir mon programme shell.
Je réalise un programme shell sous Linux pour automatiser l'importation de données dans une base de données mysql.
Chaque fichier contient des milliers de lignes avec un nombre variable de champs.

Pour faire l'importation, je prépare dans mon shell un fichier contenant une chaine sql "insert into maTable(...) values (...);" que j'exécute comme ceci:

mysql --user=userName --password=userPassword -D maBaseDeDonnees < fichierSQL

En général cela fonctionne mais lorsqu'il se produit une erreur, il s'affiche sur le output standard.
Je souhaiterais plutôt rediriger les éventuelles erreurs dans un fichier afin de pouvoir les traiter ultérieurement.

J'ai essaye ceci sans succès:

mysql --user=userName --password=userPassword -D maBaseDeDonnees < fichierSQL > fichierOutput

Je vous serais vraiment reconnaissant si quelqu'un peut m'aider a trouver comment rediriger les erreurs mysql vers un fichier.

Merci par avance

notkinvi

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
6 sept. 2008 à 01:19
Pour rediriger la sortie d'erreur et la sortie standard il faut utiliser les opérateurs 1> et/ou 2>. Exemple avec un petit programme en C++ dont le code est :
#include <iostream>

int main(){
    std::cout << "J'écris sur la sortie standard" << std::endl;
    std::cerr << "J'écris sur la sortie d'erreur" << std::endl;
    return 0;
}

Quand je lance le programme j'écris dans la console aussi bien ce qui est écrit dans la sortie d'erreur et la sortie standard :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp
(mando@aldur) (~) $ ./a.out
J'écris sur la sortie standard
J'écris sur la sortie d'erreur

À présent effectuons une redirection de la sortie standard dans plop.1 et de la sortie d'erreur dans plop.2 :
(mando@aldur) (~) $ ./a.out 1> plop.1 2>plop.2
(mando@aldur) (~) $ cat plop.1
J'écris sur la sortie standard
(mando@aldur) (~) $ cat plop.2
J'écris sur la sortie d'erreur
Par contre > ne redirige que la sortie standard :
(mando@aldur) (~) $ ./a.out > plop.3
J'écris sur la sortie d'erreur
(mando@aldur) (~) $ cat plop.3
J'écris sur la sortie standard

Tu peux aussi rediriger les deux flux vers un même fichier :
(mando@aldur) (~) $ rm plop.4
(mando@aldur) (~) $ ./a.out 1>>plop.4 2>>plop.4
(mando@aldur) (~) $ cat plop.4
J'écris sur la sortie standard
J'écris sur la sortie d'erreur

Normalement tu es sensé pourvoir écrire :
./a.out 2>&1 > plop.4

... mais pour une raison qui m'échappe il redirige mal le flux :s

Bonne chance
2
Bonjour mamiemando,

Ta réponse m'est fort utile.
Je pense déjà que cela va résoudre mon problème.
Je reviens juste après exécution
Merci infiniment
0