(List (FunctionDef err_exit [] (List (Com {[LIT_CHARS print]} {[LIT_CHARS -u2]} {[LIT_CHARS -n]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"]]}) (Com {[LIT_CHARS print]} {[LIT_CHARS -u2]} {[LIT_CHARS -r]} {[VarSub Command] [LIT_OTHER "["] [VarSub 1] [LIT_OTHER "]"] [LIT_OTHER ":"]} {[DQ [VarSub @ transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 2]}} None]]]}) (Com {[LIT_CHARS let]} {[LIT_VAR_LIKE "Errors+="] [LIT_CHARS 1] =}) ) ) (Com {[LIT_CHARS alias]} {[LIT_VAR_LIKE "err_exit="] [SQ ] =}) (= scope= flags=0 words=[] bindings=[('Command', {[VarSub 0 transform_ops=[VS_UNARY_DPOUND {[LIT_CHARS "*"] [LIT_SLASH /]}]]})]) (Com {[LIT_CHARS integer]} {[LIT_VAR_LIKE "Errors="] [LIT_CHARS 0] =}) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('tmp', {[ComSub (Com {[LIT_CHARS mktemp]} {[LIT_CHARS -dt]})]})]) (List (Com {[LIT_CHARS err_exit]} {[LIT_CHARS mktemp]} {[LIT_CHARS -dt]} {[LIT_CHARS failed]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]}) ) ) (Com {[LIT_CHARS trap]} {[DQ [LIT_CHARS "cd /; rm -rf "][VarSub tmp]]} {[LIT_CHARS EXIT]}) (Com {[LIT_CHARS unset]} {[LIT_CHARS HISTFILE]}) (= scope= flags=0 words=[] bindings=[('foo', {[LIT_CHARS NOVAL]}), ('bar', {[LIT_CHARS NOVAL]})]) (= scope= flags=0 words=[] bindings=[('file', {[VarSub tmp] [LIT_CHARS /test]})]) (FunctionDef foo [] (List (Com {[LIT_CHARS typeset]} {[LIT_VAR_LIKE "foo="] [LIT_CHARS NOEXIT] =}) (Com {[LIT_CHARS trap]} {[DQ [LIT_CHARS "foo=EXIT;rm -f "][VarSub file]]} {[LIT_CHARS EXIT]}) (Com < (FilenameRedirectNode filename={[VarSub file]} "> 1), > ) (If (DParen {A2 AS_OP_DEQUAL {A Atom NODE_ARITH_WORD {[VarSub 1]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}}}) (Com {[LIT_CHARS return]} {[VarSub 2]}) (DParen {A2 AS_OP_DEQUAL {A Atom NODE_ARITH_WORD {[VarSub 1]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}) (Com {[LIT_CHARS exit]} {[VarSub 2]}) (ElseTrue) (Com {[LIT_CHARS bar]} {[DQ [VarSub @]]}) ) ) ) (FunctionDef bar [] (List (Com {[LIT_CHARS typeset]} {[LIT_VAR_LIKE "bar="] [LIT_CHARS NOEXIT] =}) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS EXIT]}) (If (DParen {A2 AS_OP_DEQUAL {A Atom NODE_ARITH_WORD {[VarSub 1]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 2]}}}) (Com {[LIT_CHARS return]} {[VarSub 2]}) (DParen {A2 AS_OP_DEQUAL {A Atom NODE_ARITH_WORD {[VarSub 1]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS exit]} {[VarSub 2]}) ) ) ) (FunctionDef funcheck [] (List (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[VarSub foo]} {[LIT_CHARS EXIT]}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo "]] [VarSub @] [DQ [LIT_CHARS " : exit trap not set"]]}) ) (If (DBracket {B1 UNARY_FILE_f {[VarSub file]}}) (List (Com {[LIT_CHARS rm]} {[LIT_CHARS -r]} {[VarSub file]}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo "][VarSub @][LIT_CHARS ": doesn't remove "][VarSub file]]}) ) ) (= scope= flags=0 words=[] bindings=[('foo', {[LIT_CHARS NOVAL]}), ('bar', {[LIT_CHARS NOVAL]})]) ) ) (AndOr OP_OR_IF (Subshell (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "exit 0 is not zero"]]}) ) (AndOr OP_OR_IF (Subshell (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "return 0 is not zero"]]}) ) (AndOr OP_OR_IF (Subshell (Com {[LIT_CHARS exit]}) ) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "default exit value is not zero"]]}) ) (AndOr OP_OR_IF (Subshell (Com {[LIT_CHARS return]}) ) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "default return value is not zero"]]}) ) (Subshell (Com {[LIT_CHARS exit]} {[LIT_CHARS 35]}) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 35]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "exit 35 is "][VarSub ret][LIT_CHARS " not 35"]]}) ) (Subshell (Com {[LIT_CHARS return]} {[LIT_CHARS 35]}) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 35]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "return 35 is "][VarSub ret][LIT_CHARS " not 35"]]}) ) (AndOr OP_OR_IF (Com {[LIT_CHARS foo]} {[LIT_CHARS 0]} {[LIT_CHARS 0]}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 0 0: incorrect return"]]}) ) (Com {[LIT_CHARS funcheck]} {[LIT_CHARS 0]} {[LIT_CHARS 0]}) (Com {[LIT_CHARS foo]} {[LIT_CHARS 0]} {[LIT_CHARS 3]}) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 0 3: return is "][VarSub ret][LIT_CHARS " not 3"]]}) ) (Com {[LIT_CHARS funcheck]} {[LIT_CHARS 0]} {[LIT_CHARS 3]}) (AndOr OP_OR_IF (Com {[LIT_CHARS foo]} {[LIT_CHARS 2]} {[LIT_CHARS 0]}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 2 0: incorrect return"]]}) ) (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[VarSub bar]} {[LIT_CHARS EXIT]}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 2 0: bar exit trap not set"]]}) ) (Com {[LIT_CHARS funcheck]} {[LIT_CHARS 2]} {[LIT_CHARS 0]}) (Com {[LIT_CHARS foo]} {[LIT_CHARS 2]} {[LIT_CHARS 3]}) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 2 3: return is "][VarSub ret][LIT_CHARS " not 3"]]}) ) (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[VarSub bar]} {[LIT_CHARS EXIT]}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 2 3: bar exit trap not set"]]}) ) (Com {[LIT_CHARS funcheck]} {[LIT_CHARS 2]} {[LIT_CHARS 3]}) (Subshell (Com {[LIT_CHARS foo]} {[LIT_CHARS 3]} {[LIT_CHARS 3]}) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "foo 3 3: return is "][VarSub ret][LIT_CHARS " not 3"]]}) ) (= scope= flags=0 words=[] bindings=[('foo', {[LIT_CHARS EXIT]})]) (Com {[LIT_CHARS funcheck]} {[LIT_CHARS 3]} {[LIT_CHARS 3]}) (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[VarSub file]} "> 1), (HereDocRedirectNode here_end='!' do_expansion=True body_word={[DQ [LIT_CHARS "return 3\n"][LIT_CHARS "exit 4\n"]]} 0), > ) (Subshell (Com {[LIT_CHARS .]} {[VarSub file]}) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "return in dot script is "][VarSub ret][LIT_CHARS " should be 3"]]}) ) (Com {[LIT_CHARS chmod]} {[LIT_CHARS 755]} {[VarSub file]}) (Subshell (Com {[VarSub file]}) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "return in script is "][VarSub ret][LIT_CHARS " should be 3"]]}) ) (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[VarSub file]} "> 1), (HereDocRedirectNode here_end='!' do_expansion=True body_word={[DQ [LIT_CHARS ": line 1\n"][LIT_CHARS "# next line should fail and cause an exit\n"][LIT_CHARS ": > /\n"][LIT_CHARS "exit 4\n"]]} 0), > ) (Subshell (List (Com {[LIT_CHARS .]} {[VarSub file]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "error in dot script is "][VarSub ret][LIT_CHARS " should be 1"]]}) ) (Subshell (List (Com {[VarSub file]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (= scope= flags=0 words=[] bindings=[('ret', {[VarSub ?]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ret]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 5]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "error in script is "][VarSub ret][LIT_CHARS " should be 5"]]}) ) (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[VarSub file]} "> 1), (HereDocRedirectNode here_end='!' do_expansion=False body_word={[LIT_CHARS "print -r -- \"$0\"\n"]} 0), > ) (= scope= flags=0 words=[] bindings=[('x', {[ComSub (Com {[LIT_CHARS .]} {[VarSub file]})]})]) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[VarSub x]} {[VarSub 0]}}) (Com {[LIT_CHARS err_exit]} {[DQ [\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "0 in a dot script is "][VarSub x][LIT_CHARS ". Should be "][VarSub 0]]}) ) (= scope= flags=0 words=[] bindings=[('x', {[ComSub (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2) (HereDocRedirectNode here_end='!' do_expansion=False body_word={[LIT_CHARS "typeset -i x=1/0\n"] [LIT_CHARS "print hello\n"]} 0)]{[VarSub SHELL]} {[LIT_CHARS -i]} {[LIT_CHARS --norc]})]})]) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[VarSub x]} {[LIT_CHARS hello]}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "interactive shell terminates with error in bltin"]]}) ) (= scope= flags=0 words=[] bindings=[('x', {[ComSub (List (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) (Com {[LIT_CHARS false]}) (Com {[LIT_CHARS print]} {[LIT_CHARS bad]}) )]})]) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[VarSub x]} {[SQ ]}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "set -e doesn't terminate script on error"]]}) ) (= scope= flags=0 words=[] bindings=[('x', {[ComSub (List (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS EXIT]}) (Com {[LIT_CHARS false]}) (Com {[LIT_CHARS print]} {[LIT_CHARS bad]}) )]})]) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ?]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "exit 0 in trap should doesn't set exit value to 0"]]}) ) (Com {[VarSub SHELL]} < (HereDocRedirectNode here_end='!' do_expansion=False body_word={[LIT_CHARS "trap 'exit 8' EXIT\n"] [LIT_CHARS "exit 1\n"]} 0), > ) (If (DParen {A2 AS_OP_NEQUAL {A Atom NODE_ARITH_WORD {[VarSub ?]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 8]}}}) (Com {[LIT_CHARS err_exit]} {[DQ [LIT_CHARS "exit 8 in trap should set exit value to 8"]]}) ) (Com {[LIT_CHARS exit]} {[ArithSub {A3 AS_OP_QMARK {A2 AS_OP_LESS {A Atom NODE_ARITH_WORD {[VarSub Errors]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 125]}}} {A Atom NODE_ARITH_WORD {[VarSub Errors]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 125]}}}]}) )