(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 '$@'))})
  ]
)