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