delorie.com/archives/browse.cgi | search |
X-Spam-Check-By: | sourceware.org |
Message-ID: | <4681CDCD.7030709@linux.vnet.ibm.com> |
Date: | Tue, 26 Jun 2007 19:39:09 -0700 |
From: | Richard A Nelson <cowboy AT linux DOT vnet DOT ibm DOT com> |
User-Agent: | Mozilla-Thunderbird 2.0.0.4 (X11/20070622) |
MIME-Version: | 1.0 |
To: | cygwin AT cygwin DOT com |
Subject: | Bash is broken wrt trap :( |
X-Spam-Score: | -4.322 () ALL_TRUSTED,BAYES_00,DKIM_POLICY_SIGNSOME,TW_PD |
Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm |
List-Id: | <cygwin.cygwin.com> |
List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> |
List-Archive: | <http://sourceware.org/ml/cygwin/> |
List-Post: | <mailto:cygwin AT cygwin DOT com> |
List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> |
Sender: | cygwin-owner AT cygwin DOT com |
Mail-Followup-To: | cygwin AT cygwin DOT com |
Delivered-To: | mailing list cygwin AT cygwin DOT com |
Cygwin bash is actually a newer version than Debian/RH ships - but has one flaw not shared by the other distributions. I have code that must run on AIX (bash/ksh93), Linux (bash/ksh93), and Cygwin (bash - pdksh is not sufficient and I couldn't find ksh93)... and trap handling is a large part of what the scripts do. Here is the main trap setup: ------------------------------------------------------------------------- # Set a trap to catch non-zero return codes ERROR="*** ERROR *** ERROR *** ERROR ***"; trap "echo \"$0:$ERROR\";" ERR; if [ -n "$BASH" -a "${OS:0:6}" != 'CYGWIN' ]; then UNWIND="trap 'false' RETURN;return 1"; else UNWIND='return 1'; fi; trap "echo \"$0:$ERROR\";$UNWIND" ERR; set -e; ------------------------------------------------------------------------ Each function sets its own trap handling: Parse_Options () { trap "echo \"$0/Options:$ERROR\";$UNWIND" ERR; ... } Here is the test driver I'm working with ------------------------------------------------------------------------- trap "echo \"$0: $ERROR\";exit 1" ERR QUIT ABRT ALRM TERM; do_a () { trap "echo \"$0/do_a: $ERROR\";$UNWIND" ERR; echo '>>do_a'; do_b; } do_b () { trap "echo \"$0/do_b: $ERROR\";$UNWIND" ERR; echo '>>do_b'; false; } echo '>>main' do_a; -------------------------------------------------------------------------- ksh93 will propagate the error upwards via the 'return 1' clause. bash, however requires setting a RETURN trap and forcing an error in the function's caller :( Anyway this works everywhere except Cygwin, as you can see I've disabled the RETURN TRAP for Cygwin, as with it enabled, the script loops forever (or until it faults) - continually reissuing the trap in do_b ! -------------------------------------------------------------------------- + echo '>>main' >>main + do_a + trap 'echo "./test/do_a: *** ERROR *** ERROR *** ERROR ***";trap '\''false'\ + echo '>>do_a' >>do_a + do_b + trap 'echo "./test/do_b: *** ERROR *** ERROR *** ERROR ***";trap '\''false'\ + echo '>>do_b' >>do_b + false ++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++ trap false RETURN ++ return 1 +++ false ++++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++++ trap false RETURN ++++ return 1 +++++ false ++++++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++++++ trap false RETURN ++++++ return 1 +++++++ false ++++++++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++++++++ trap false RETURN ++++++++ return 1 +++++++++ false ++++++++++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++++++++++ trap false RETURN ++++++++++ return 1 +++++++++++ false ++++++++++++ echo './test/do_b: *** ERROR *** ERROR *** ERROR ***' ./test/do_b: *** ERROR *** ERROR *** ERROR *** ++++++++++++ trap false RETURN ++++++++++++ return 1 +++++++++++++ false ... --------------------------------------------------------------------------------- -- Richard A Nelson (Rick) cowboy@(vnet|us).ibm.com Phone: 1-408-463-5584 Fax: 1-408-463-3873 COBOL Development IBM Silicon Valley Laboratory http://www.ibm.com/software/awdtools/cobol/ -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |