Bash Error Chain Construct

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Jun 20 15:54:30 EEST 2008


On Fri, 20 Jun 2008 14:05:19 +0300, "basOS G" <noxelia at gmail.com> wrote:
> Εστω οτι ειμαστε μεσα σε ενα 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
> υπαρχει ? Μπορούμε να κανουμε κατι για να δουλεψει με τις παρενθέσεις ;

Γιατί δεν το γράφεις με τον πιο 'clean' τρόπο του if-then;

Αυτό που θέλεις πάντως είναι:

    must_exec || { echo "Fatal error" ; exit 1 ; }

Η διαφορά των εντολών σε { ... } από τις εντολές σε ( ... ) είναι
ακριβώς αυτή που ψυλιάστηκες, και την περιγράφει το bash manual.  Οι
εντολές σε παρενθέσεις τρέχουν σε sub-shell, οπότε το parent shell δε
μπορεί να κάνει 'exit'.  Οι εντολές σε αγκύλες τρέχουν στο ίδιο process,
με όλα τα καλά αλλά και τα κακά που αυτό συνεπάγεται: π.χ. αν πειράξεις
το environment μέσα σε { ... }, οι αλλαγές επηρεάζουν το ΑΡΧΙΚΟ shell.

Σημείωση: Προσοχή στο τελευταίο ';' πριν το '}'.  Ναι, χρειάζεται!



More information about the Linux-greek-users mailing list