Bash script και έλεγχος μηνυμάτων λάθους της mysql

apkoutsou | Κυρ, 09/26/2010 - 19:24 | 2' | 6

Φτιάχνω ένα μικρό script, το οποίο μεταξύ άλλων θα χρησιμοποιεί και την mysql για να αλλάζει κάποια πράγματα σε μία βάση δεδομένων. Όλα τα στοιχεία για την σύνδεση στον mysql server θα τα δίνει ο χρήστης στην γραμμή εντολών, οπότε θα πρέπει να γίνεται έλεγχος στην αρχή, εάν τα στοιχεία είναι σωστά, ώστε να σταματά η εκτέλεση του script στην αρχή (για να μην γίνονται άλλες αλλαγές, οι οποίες χωρίς τις αλλαγές στην βάση θα προκαλέσουν χάος). Για τον σκοπό αυτό δίνω την εντολή:

sql_CHECK=`mysql -u$DB_USERNAME -p$DB_PASSWORD -D$DB_NAME <<< exit`

Το πρόβλημα είναι ότι, όταν υπάρχει όντως λάθος στην εισαγωγή των στοιχείων, το μήνυμα επιστροφής της mysql δεν αποθηκεύεται στην μεταβλητή sql_CHECK (ώστε να ελέγξω και την ροή του script), αλλά εμφανίζεται στο prompt και η εκτέλεση του script προχωρά κανονικά. Έχω ψάξει λίγο στο internet χωρίς να βρω κάποια λύση...

Έχει κανείς καμιά ιδέα για το πώς μπορώ να έχω πρόσβαση στα μηνύματα λάθους της mysql μέσα από το bash script;

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Το έχω δει αυτό, το θέμα είναι πώς θα σταματήσω την mysql να μου επιστρέφει το μήνυμα λάθους ώστε να βγάζω το δικό μου μήνυμα?

--------------------------------------------------------------------

LawyersVoice.grLawyersVoice.gr - To forum των ν'εων δικηγόρων

 Δεν χρειάζεται να σταματήσεις την mysql.

Απλά θα κάνεις ένα ερώτημα όπως έχεις γράψει ανωτέρω, χωρίς όμως να παιρνάς το αποτέλεσμα σε μεταβλητή.

πχ (δεν σκαμπάζω μια από mysql) δοκίμασε κατευθείαν στη γραμμή εντολών για να τσεκάρεις το exit status:

mysql --ρωτάω-κάτι-που-θα-βγάλει-exit_status

echo $?

 

Αν πάλι λέω @@ρολογίες θα το ψάξω αν γίνεται με redirect των stdout and stderr (standard output, error) σε μεταβλητή με όμορφο τρόπο

Η παραπάνω εντολή ξεκινά το περιβάλλον της mysql (όπου δίνεις εντολές) και βγαίνει έξω. Όταν δώσεις π.χ. λάθος κωδικο σου επιστρέφει το αντίστοιχο μήνυμα λάθους (πριν από οποιαδήποτε άλλη εντολή δώσεις), το οποίο θέλω να πιάσω και να χειριστώ, χωρίς να φαίνεται κάτι στο prompt.

Επίσης, δεν μπορώ να δώσω εντολή στην mysql εάν δεν έχω ελέγξει ότι όλα είναι σωστά και δεν έχουν προηγηθεί κάποιες άλλες ενέργειες, οι οποίες εάν δεν πετύχει η σύνδεση με την βάση δεδομένων θα προκληθεί "χάος".

Θα κοιτάξω μήπως μπορέσω να απενεργοποίησω από την mysql τα μηνύματα στο prompt και χρησιμοποιήσω το $? για τον έλεγχο της σύνδεσης.

--------------------------------------------------------------------

LawyersVoice.grLawyersVoice.gr - To forum των νέων δικηγόρων

ααααα, τώρα εξηγούνται όλα :)

Νόμιζα ότι τα λάθος δεδομένα που εισάγει ο χρήστης θα έβγαζαν κατευθείαν σφάλμα σε bash shell χωρίς να ξεκινήσει το mysql shell πχ

 

luckyb@luckyb-laptop:~$ mysql -uluckyb
ERROR 1045 (28000): Access denied for user 'luckyb'@'localhost' (using password: NO) 
luckyb@luckyb-laptop:~$

 

Έχουμε λοιπόν:

1. η εντολή mysql θα ξεκινήσει ούτως ή άλλως το shell της mysql.

2. Θέλεις να ελέγξεις την έξοδο του mysql shell για να την βάλεις σε συνθήκη

Δεν είμαι σίγουρος ότι γίνεται μέσω bash !!!!

Πρώτο δείγμα είναι ότι δεν σου αποθηκεύεται η έξοδος της εντολής στη μεταβλητή sql_CHECK (κι ας είναι σε backtits)

Μπορείς να κάνεις μια απλή δοκιμή:

Κάνε redirect τις standard output & error της εντολής σ'ενα αρχείο και μετά δες τι έχει αποθηκευτεί. πχ:

 

$ mysql -u$DB_USERNAME -p$DB_PASSWORD -D$DB_NAME &> testMysqlOut.txt

 

Όταν δίνεις λάθος username ή password το shell της mysql δεν ξεκινά, και σου επιστρέφει μήνυμα λάθους στο prompt. Το θέμα είναι ότι όταν δώσεις σωστά στοιχεία πρόσβασης και κάποια εντολή (π.χ. μέσω του τελεστή -e) το αποτέλεσμα αποθηκεύεται στην μεταβλητή! Για αυτό μου κάνει εντύπωση που δεν μπορώ να αποθηκεύσω το μήνυμα λάθους, το οποίο ούτως ή άλλως επιστρέφει στο prompt...

Το redirect σε αρχείο λειτουργεί μια χαρά και το μήνυμα λάθους αποθηκεύεται, αλλά τώρα για ένα script θα κάθομαι να διαβάζω και να δημιουργώ αρχεία ?? Άσε που δεν είναι και ασφαλές...

Θα δοκιμάσω απόψε το $? και θα δω εάν μπορεί να δουλέψει έτσι...

--------------------------------------------------------------------

LawyersVoice.grLawyersVoice.gr - To forum των νέων δικηγόρων