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