(command.CommandList
  children: [
    (C {<set>} {<-e>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:common_objpfx)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [54]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_program_prefix)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$2')}
          spids: [57]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:objpfx)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$3')}
          spids: [60]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(${ Id.VSub_Name test_program_prefix)} {(${ Id.VSub_Name objpfx) <test-freopen>} 
          {(${ Id.VSub_Name objpfx) <test-freopen.out>}
        )
        (command.Simple
          words: [{<cmp>} {(${ Id.VSub_Name objpfx) <test-freopen.out>} {<->}]
          redirects: [
            (redir
              op: <Id.Redir_DLess '<<'>
              loc: (redir_loc.Fd fd:0)
              arg: 
                (redir_param.HereDoc
                  here_begin: {(DQ <EOF>)}
                  here_end_span_id: 96
                  stdin_parts: [<'Hello world (mb)\n'> <'Hello world (wc)\n'>]
                )
            )
          ]
          do_fork: T
        )
      ]
    )
    (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{($ Id.VSub_QMark '$?')})
  ]
)