Bash Error Chain Construct
Giorgos Keramidas
keramida at ceid.upatras.gr
Fri Jun 20 16:07:13 EEST 2008
On Fri, 20 Jun 2008 14:20:57 +0300, Σπύρος Γεωργαράς <sng at hellug.gr> wrote:
> O/H basOS G έγραψε:
> | Εστω οτι ειμαστε μεσα σε ενα bash σκριπτ
> | Εαν μια εντολη που *πρεπει* να εκτελεστει αποτύχει τι μπορούμε να κανουμε
> |
> | ΤΟ παρακατω δεν δουλευει γιατι οι παρενθέσεις ανοίγουν κάποιο subshell.
> | must_exec || ( echo "Fatal Error" && exit 1)
> |
> | Το πατακατω δε δουλεύει γιατι γινεται evaluated ως (must_exec || echo
> | "Error") && exit 1 οπότε παντα βγαίνει
> | must_exec || echo "Fatal Error" && exit 1
> |
> | Καποια πρόταση εκτος απο το
> | if ! must_exec ; then; echo "Fatal Error" ; exit 1 ;fi
> | υπαρχει ? Μπορούμε να κανουμε κατι για να δουλεψει με τις παρενθέσεις ;
>
> Δοκίμασε αυτό
>
> must_exec || {
> echo "Fatal Error"
> exit 1
> }
Ακριβώς. Και μετά, όπως έγραψα και στο άλλο post, ξέχνα το εντελώς,
πριν μπεις στον πειρασμό να γράφεις κώδικα με δομές όπως:
cmd1 && {
cmd2 || cmd3 || {
cmd4 && {
cmd5
}
}
cmd6 || {
cmd7 && cmd8 || {
cmd9
}
}
}
Το ξέρω πως αυτό είναι `reductio ad absurdum'[1], και πιθανόν να μην
έχει ούτε ο Βάσος, ούτε κανείς άλλος σκοπό να καταλήξει έτσι ο κώδικάς
του. Από την άλλη όμως, πρόσφατα (aka μέσα στα τελευταία 4 χρόνια) έχει
χρειαστεί να ξαναγράψω από την αρχή αρκετά μεγάλα scripts --- της τάξης
των 3000-5000 γραμμών --- για να κάνω τον κώδικα λίγο πιο κατανοητό,
αφαιρώντας τέτοια «εκτρώματα» σαν το παραπάνω, γράφοντας shell functions
για κομμάτια κώδικα που εμφανίζονταν συχνά, κλπ.
[1] http://en.wikipedia.org/wiki/Reductio_ad_absurdum
Το κόλπο με τις αγκύλες παίζει, αλλά η δική μου άποψη είναι ότι είναι
καλύτερα να το αποφεύγει ο κόσμος. Ενθαρρύνει τον shell programmer να
γράψει περίπλοκες, δυσνόητες δομές από shaghetti-logic, τις οποίες μετά
από καμιά βδομάδα δε θα μπορεί να διαβάσει ΟΥΤΕ ο ίδιος.
Αντίθετα, κάτι σαν το:
if cmd1 foo ; then
#
# We have `foo' around, so do `bar' and `baz'.
#
if ! bar ; then
err 1 "Cannot bar."
fi
if ! baz ; then
err 1 "Cannot baz."
fi
fi
Είναι συνήθως το ίδιο ευανάγνωστο και μετά από μήνες.
More information about the Linux-greek-users
mailing list