(List (FunctionDef stderr [] (Com {[LIT_CHARS echo]} {[DQ [VarSub @]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) (FunctionDef putd [] (Com {[LIT_CHARS stderr]} {[DQ [VarSub 1][LIT_CHARS "=<"][VarSub 1 transform_ops=[(!ref)]][LIT_CHARS ">"]]}) ) (FunctionDef exists [] (Com {[LIT_CHARS type]} {[DQ [VarSub @]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) (FunctionDef test_grepq [] (List (= scope= flags=0 words=[] bindings=[('output', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[LIT_CHARS x]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS x]}) )]]})]) (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[VarSub ?]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (AndOr OP_OR_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub output]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (FunctionDef test_greps [] (List (= scope= flags=0 words=[] bindings=[('output', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[LIT_CHARS x]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -s]} {[LIT_CHARS x]}) )]]})]) (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[VarSub ?]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (AndOr OP_OR_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub output]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (If (Com {[LIT_CHARS test_grepq]}) (FunctionDef matches [] (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[DQ [VarSub @]]}) ) (Com {[LIT_CHARS test_greps]}) (FunctionDef matches [] (Com {[LIT_CHARS grep]} {[LIT_CHARS -s]} {[DQ [VarSub @]]}) ) (ElseTrue) (FunctionDef matches [] (Com {[LIT_CHARS grep]} {[DQ [VarSub @]]} < (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) ) ) (FunctionDef pluralize [] (If (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub 1]]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS echo]} {[VarSub 1] [LIT_CHARS s]}) (ElseTrue) (While (Com {[LIT_CHARS read]} {[LIT_CHARS line]}) (Com {[LIT_CHARS pluralize]} {[VarSub line]}) ) ) ) (FunctionDef getc [] (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS -n1]} {[LIT_CHARS -d]} {[SQ ]} {[DQ [VarSub @]]} more_env=[('IFS', {[SQ ]})] ) ) (FunctionDef read_until [] (List (= scope= flags=0 words=[] bindings=[('glob', {[VarSub 1]})]) (Com {[LIT_CHARS shift]}) (= scope= flags=0 words=[] bindings=[('var', {[VarSub 1]})]) (Com {[LIT_CHARS shift]}) (= scope= flags=0 words=[{[LIT_CHARS out]}] bindings=[]) (While (Com {[LIT_CHARS getc]} {[LIT_CHARS ch]}) (List (= scope= flags=0 words=[] bindings=[('out', {[DQ [VarSub out][VarSub ch]]})]) (Case to_match={[DQ [VarSub out]]}, pat_word_list=[[{[LIT_OTHER "*"] [VarSub glob]}]] (List (= scope= flags=0 words=[] bindings=[('FOUND', {[LIT_CHARS 1]})]) (= scope= flags=1 words=[{[VarSub var] [LIT_OTHER "="] [DQ [VarSub out transform_ops=[VS_UNARY_PERCENT {[VarSub glob]}]]]}] bindings=[]) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) ) ) (If (Com {[LIT_OTHER "["]} {[LIT_CHARS -z]} {[DQ [VarSub out]]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS false]}) (ElseTrue) (List (= scope= flags=0 words=[] bindings=[('FOUND', {[LIT_CHARS 0]})]) (= scope= flags=1 words=[{[VarSub var] [LIT_OTHER "="] [DQ [VarSub out]]}] bindings=[]) (Com {[LIT_CHARS true]}) ) ) ) ) (FunctionDef trim_l [] (List (= scope= flags=0 words=[] bindings=[('str', {[VarSub 1 transform_ops=[(!ref)]]})]) (= scope= flags=0 words=[] bindings=[('str', {[DQ [VarSub str transform_ops=[VS_UNARY_DPOUND {[LIT_CHARS "+([[:space:]])"]}]]]})]) (= scope= flags=1 words=[{[DQ [VarSub 1]] [LIT_OTHER "="] [DQ [VarSub str]]}] bindings=[]) ) ) (FunctionDef trim_r [] (List (= scope= flags=0 words=[] bindings=[('str', {[VarSub 1 transform_ops=[(!ref)]]})]) (= scope= flags=0 words=[] bindings=[('str', {[DQ [VarSub str transform_ops=[VS_UNARY_DPERCENT {[LIT_CHARS "+([[:space:]])"]}]]]})]) (= scope= flags=1 words=[{[DQ [VarSub 1]] [LIT_OTHER "="] [DQ [VarSub str]]}] bindings=[]) ) ) (FunctionDef trim [] (List (Com {[LIT_CHARS trim_l]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS trim_r]} {[DQ [VarSub @]]}) ) ) (FunctionDef db_safe [] (List (= scope= flags=0 words=[] bindings=[('str', {[DQ [VarSub 1 transform_ops=[(!ref)]][LIT_CHARS .]]})]) (= scope= flags=0 words=[] bindings=[('escaped_quote', {[DQ [\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS "'"]]})]) (= scope= flags=0 words=[] bindings=[('str', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub str transform_ops=[PatSub {[\ LIT_ESCAPED_CHAR "\\'"]} {[VarSub escaped_quote]} do_all]]]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS line]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[DQ [VarSub line][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS n]]}) ) )]]})]) (= scope= flags=1 words=[{[DQ [VarSub 1]] [LIT_OTHER "="] [DQ [LIT_CHARS "'"][VarSub str transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub str transform_ops=[(#len)]]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]][LIT_CHARS "'"]]}] bindings=[]) ) ) (FunctionDef bash_safe [] (List (= scope= flags=0 words=[] bindings=[('str', {[DQ [VarSub 1 transform_ops=[(!ref)]]]})]) (= scope= flags=0 words=[] bindings=[('escaped_quote', {[DQ [LIT_CHARS "'"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS "''"]]})]) (= scope= flags=1 words=[{[DQ [VarSub 1]] [LIT_OTHER "="] [DQ [LIT_CHARS "'"][VarSub str transform_ops=[PatSub {[\ LIT_ESCAPED_CHAR "\\'"]} {[VarSub escaped_quote]} do_all]][LIT_CHARS "'"]]}] bindings=[]) ) ) (FunctionDef join [] (List (= scope= flags=0 words=[] bindings=[('delim', {[DQ [VarSub 1]]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS read]} {[LIT_CHARS line]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[DQ [VarSub line]]}) ) (While (Com {[LIT_CHARS read]} {[LIT_CHARS line]}) (List (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[DQ [VarSub delim]]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[DQ [VarSub line]]}) ) ) ) ) )