(command.CommandList children: [ (C {<set>} {<-o>} {<nounset>}) (C {<set>} {<-o>} {<pipefail>}) (C {<set>} {<-o>} {<errexit>}) (command.ShFunction name: count-procs body: (BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'sh='> ($ Id.VSub_Number '$1')}) (C {<local>} {<Id.Lit_VarLike 'code='> ($ Id.VSub_Number '$2')}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:code) op: assign_op.Equal rhs: {(SQ <'echo "[pid-of-sh $$]";'>) (DQ <' '> ($ Id.VSub_DollarName '$code'))} spids: [69] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (command.Pipeline children: [ (command.Simple words: [ {<strace>} {<-e>} {(SQ <'trace=fork,execve'>)} {<-e>} {(SQ <'signal=none'>)} {<-e>} {(SQ <'verbose=none'>)} {<-ff>} {<-->} {($ Id.VSub_DollarName '$sh')} {<-c>} {(DQ ($ Id.VSub_DollarName '$code'))} ] redirects: [ (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) (C {<fgrep>} {(SQ <'[pid'>)}) ] negated: F ) (C {<true>}) ] ) ] ) ) (command.ShFunction name: test-many body: (BraceGroup children: [ (command.ForEach iter_name: code iter_words: [{(DQ ($ Id.VSub_At '$@'))}] do_arg_iter: F body: (command.DoGroup children: [ (C {<echo>}) (C {<echo>}) (C {<echo>} {(DQ <'--- '> ($ Id.VSub_DollarName '$code') <' ---'>)}) (C {<echo>}) (command.ForEach iter_name: sh iter_words: [{<dash>} {<bash>} {<mksh>} {<zsh>}] do_arg_iter: F body: (command.DoGroup children: [ (C {<echo>}) (C {<echo>}) (C {<echo>} {(DQ <'--- '> ($ Id.VSub_DollarName '$sh') <' ---'>)}) (C {<echo>}) (C {<count-procs>} {($ Id.VSub_DollarName '$sh')} {(DQ ($ Id.VSub_DollarName '$code'))} ) ] ) ) ] ) ) ] ) ) (command.ShFunction name: t1 body: (BraceGroup children: [ (C {<test-many>} {(SQ <'echo hi'>)} {(SQ <'/bin/echo one; /bin/echo two'>)} {(SQ <'{ /bin/echo one; /bin/echo two; }'>)} {(SQ <'{ echo one; echo two; } | wc -l'>)} {(SQ <'( echo one; echo two ) | wc -l'>)} ) ] ) ) (C {(DQ ($ Id.VSub_At '$@'))}) ] )