(CommandList
  children: [
    (FuncDef
      name: err_exit
      body: 
        (BraceGroup
          children: [
            (C {(print)} {(-u2)} {(-r)} 
              {(SQ <Lit_EscapedChar "\\t">) 
                (DQ (${ VSub_Name Command) ("[") ($ VSub_Number "$1") ("] ") 
                  (BracedVarSub
                    token: <VSub_At "@">
                    suffix_op: (Slice begin:(ArithWord w:{(Lit_Digits 2)}))
                    spids: [80 84]
                  )
                )
              }
            )
            (DParen child:(UnaryAssign op_id:Node_PostDPlus child:(LhsName name:Errors)))
          ]
          spids: [61]
        )
      spids: [57 60]
    )
    (C {(alias)} {(Lit_VarLike "err_exit=") (SQ <"err_exit $LINENO">)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:Command)
          op: Equal
          rhs: 
            {
              (BracedVarSub
                token: <VSub_Number 0>
                suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{("*") (Lit_Slash /)})
                spids: [105 110]
              )
            }
          spids: [104]
        )
      ]
      spids: [104]
    )
    (C {(integer)} {(Lit_VarLike "aware=") (0)} {(Lit_VarLike "contrary=") (0)} 
      {(Lit_VarLike "Errors=") (0)} {(Lit_VarLike "ignorant=") (0)}
    )
    (AndOr
      children: [
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:tmp)
              op: Equal
              rhs: 
                {
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(mktemp)} {(-dt)})])
                    left_token: <Left_CommandSub "$(">
                    spids: [128 132]
                  )
                }
              spids: [127]
            )
          ]
          spids: [127]
        )
        (BraceGroup
          children: [
            (Sentence
              child: (C {(err_exit)} {(mktemp)} {(-dt)} {(failed)})
              terminator: <Op_Semi ";">
            )
            (Sentence child:(C {(exit)} {(1)}) terminator:<Op_Semi ";">)
          ]
          spids: [136]
        )
      ]
      op_id: Op_DPipe
    )
    (C {(trap)} {(DQ ("cd /; rm -rf ") ($ VSub_Name "$tmp"))} {(EXIT)})
    (FuncDef
      name: test_glob
      body: 
        (BraceGroup
          children: [
            (C {(typeset)} {(lineno)} {(expected)} {(drop)} {(arg)} {(got)} {(sep)} {(op)} {(val)} {(add)} 
              {(del)}
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:lineno)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [194]
                )
              ]
              spids: [194]
            )
            (C {(shift)})
            (If
              arms: [
                (if_arm
                  cond: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {($ VSub_Number "$1")}
                          right: {(--) (Lit_Other "*")}
                        )
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:del)
                          op: Equal
                          rhs: 
                            {
                              (BracedVarSub
                                token: <VSub_Number 1>
                                suffix_op: (StringUnary op_id:VOp1_Pound arg_word:{(--)})
                                spids: [218 222]
                              )
                            }
                          spids: [217]
                        )
                      ]
                      spids: [217]
                    )
                    (C {(shift)})
                  ]
                  spids: [-1 215]
                )
              ]
              spids: [-1 228]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {($ VSub_Number "$1")}
                          right: {(Lit_Other "+") (Lit_Other "+") (Lit_Other "*")}
                        )
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:add)
                          op: Equal
                          rhs: 
                            {
                              (BracedVarSub
                                token: <VSub_Number 1>
                                suffix_op: (StringUnary op_id:VOp1_Pound arg_word:{("++")})
                                spids: [249 253]
                              )
                            }
                          spids: [248]
                        )
                      ]
                      spids: [248]
                    )
                    (C {(shift)})
                  ]
                  spids: [-1 246]
                )
              ]
              spids: [-1 259]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [262]
                )
              ]
              spids: [262]
            )
            (C {(shift)})
            (If
              arms: [
                (if_arm
                  cond: [(DParen child:(ArithVarRef name:contrary))]
                  action: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_GlobDEqual
                                  left: {($ VSub_Name "$expected")}
                                  right: {(DQ ("<Beware> ")) (Lit_Other "*")}
                                )
                            )
                          ]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:expected)
                                  op: Equal
                                  rhs: 
                                    {
                                      (BracedVarSub
                                        token: <VSub_Name expected>
                                        suffix_op: 
                                          (StringUnary
                                            op_id: VOp1_Pound
                                            arg_word: {(DQ ("<Beware> "))}
                                          )
                                        spids: [300 306]
                                      )
                                    }
                                  spids: [299]
                                )
                              ]
                              spids: [299]
                            )
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:expected)
                                  op: Equal
                                  rhs: {(DQ ($ VSub_Name "$expected") (" <Beware>"))}
                                  spids: [309]
                                )
                              ]
                              spids: [309]
                            )
                          ]
                          spids: [-1 297]
                        )
                      ]
                      spids: [-1 316]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_GlobDEqual
                                  left: {($ VSub_Name "$expected")}
                                  right: {(Lit_Other "*") (DQ ("<aXb> <abd>")) (Lit_Other "*")}
                                )
                            )
                          ]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:expected)
                                  op: Equal
                                  rhs: 
                                    {
                                      (BracedVarSub
                                        token: <VSub_Name expected>
                                        suffix_op: 
                                          (PatSub
                                            pat: {(DQ ("<aXb> <abd>"))}
                                            replace: {(DQ ("<abd> <aXb>"))}
                                            do_all: False
                                            do_prefix: False
                                            do_suffix: False
                                          )
                                        spids: [339 349]
                                      )
                                    }
                                  spids: [338]
                                )
                              ]
                              spids: [338]
                            )
                          ]
                          spids: [-1 336]
                        )
                      ]
                      spids: [-1 352]
                    )
                  ]
                  spids: [-1 279]
                )
              ]
              spids: [-1 355]
            )
            (ForEach
              iter_name: arg
              do_arg_iter: True
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:got)
                          op: Equal
                          rhs: 
                            {
                              (DQ ($ VSub_Name "$got") ($ VSub_Name "$sep") ("<") ($ VSub_Name "$arg") 
                                (">")
                              )
                            }
                          spids: [365]
                        )
                      ]
                      spids: [365]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:sep)
                          op: Equal
                          rhs: {(DQ (" "))}
                          spids: [375]
                        )
                      ]
                      spids: [375]
                    )
                  ]
                  spids: [363 381]
                )
              spids: [-1 -1]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (DParen
                      child: 
                        (ArithBinary
                          op_id: Arith_DAmp
                          left: (ArithVarRef name:ignorant)
                          right: (ArithVarRef name:aware)
                        )
                    )
                  ]
                  action: [
                    (If
                      arms: [
                        (if_arm
                          cond: [(DBracket expr:(WordTest w:{($ VSub_Name "$del")}))]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:got)
                                  op: Equal
                                  rhs: {(DQ ("<") ($ VSub_Name "$del") ("> ") ($ VSub_Name "$got"))}
                                  spids: [411]
                                )
                              ]
                              spids: [411]
                            )
                          ]
                          spids: [-1 409]
                        )
                      ]
                      spids: [-1 420]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [(DBracket expr:(WordTest w:{($ VSub_Name "$add")}))]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:expected)
                                  op: Equal
                                  rhs: 
                                    {
                                      (DQ ("<") ($ VSub_Name "$add") ("> ") ($ VSub_Name "$expected"))
                                    }
                                  spids: [434]
                                )
                              ]
                              spids: [434]
                            )
                          ]
                          spids: [-1 432]
                        )
                      ]
                      spids: [-1 443]
                    )
                  ]
                  spids: [-1 398]
                )
              ]
              spids: [-1 446]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobNEqual
                          left: {($ VSub_Name "$got")}
                          right: {(DQ ($ VSub_Name "$expected"))}
                        )
                    )
                  ]
                  action: [
                    (C {(SQ <err_exit>)} {($ VSub_Name "$lineno")} 
                      {
                        (DQ ("glob -- expected '") ($ VSub_Name "$expected") ("', got '") 
                          ($ VSub_Name "$got") ("'")
                        )
                      }
                    )
                  ]
                  spids: [-1 464]
                )
              ]
              spids: [-1 481]
            )
          ]
          spids: [168]
        )
      spids: [164 167]
    )
    (C {(alias)} {(Lit_VarLike "test_glob=") (SQ <"test_glob $LINENO">)})
    (FuncDef
      name: test_case
      body: 
        (BraceGroup
          children: [
            (C {(typeset)} {(lineno)} {(expected)} {(subject)} {(pattern)} {(got)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:lineno)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [513]
                )
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [516]
                )
                (assign_pair
                  lhs: (LhsName name:subject)
                  op: Equal
                  rhs: {($ VSub_Number "$3")}
                  spids: [519]
                )
                (assign_pair
                  lhs: (LhsName name:pattern)
                  op: Equal
                  rhs: {($ VSub_Number "$4")}
                  spids: [522]
                )
              ]
              spids: [513]
            )
            (C {(eval)} 
              {
                (DQ ("\n") ("\t\tcase ") ($ VSub_Name "$subject") (" in\n") ("\t\t") 
                  ($ VSub_Name "$pattern") (")\tgot='<match>' ;;\n") ("\t\t*)\t\tgot='<nomatch>' ;;\n") ("\t\tesac\n") ("\t")
                )
              }
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobNEqual
                          left: {($ VSub_Name "$got")}
                          right: {(DQ ($ VSub_Name "$expected"))}
                        )
                    )
                  ]
                  action: [
                    (C {(SQ <err_exit>)} {($ VSub_Name "$lineno")} 
                      {
                        (DQ ("case ") ($ VSub_Name "$subject") (" in ") ($ VSub_Name "$pattern") 
                          (") -- expected '") ($ VSub_Name "$expected") ("', got '") ($ VSub_Name "$got") ("'")
                        )
                      }
                    )
                  ]
                  spids: [-1 557]
                )
              ]
              spids: [-1 578]
            )
          ]
          spids: [497]
        )
      spids: [493 496]
    )
    (C {(alias)} {(Lit_VarLike "test_case=") (SQ <"test_case $LINENO">)})
    (C {(unset)} {(undefined)})
    (AndOr
      children: [
        (C {(cd)} {($ VSub_Name "$tmp")})
        (BraceGroup
          children: [
            (Sentence
              child: (C {(err_exit)} {(DQ ("cd ") ($ VSub_Name "$tmp") (" failed"))})
              terminator: <Op_Semi ";">
            )
            (Sentence child:(C {(exit)} {(1)}) terminator:<Op_Semi ";">)
          ]
          spids: [601]
        )
      ]
      op_id: Op_DPipe
    )
    (C {(export)} {(Lit_VarLike "LC_COLLATE=") (C)})
    (C {(touch)} {(B)} {(b)})
    (C {(set)} {(--)} {(Lit_Other "*")})
    (Case
      to_match: {($ VSub_Star "$*")}
      arms: [
        (case_arm
          pat_list: [{(SQ <"b B">)}]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:contrary) op:Equal rhs:{(1)} spids:[648])]
              spids: [648]
            )
          ]
          spids: [644 646 651 -1]
        )
        (case_arm
          pat_list: [{(b)} {(B)}]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:ignorant) op:Equal rhs:{(1)} spids:[658])]
              spids: [658]
            )
          ]
          spids: [653 656 661 -1]
        )
      ]
      spids: [637 641 663]
    )
    (C {(set)} {(--)} 
      {
        (CommandSubPart
          command_list: 
            (CommandList
              children: [
                (SimpleCommand
                  words: [{(/bin/sh)} {(-c)} {(SQ <"echo [a-c]">)}]
                  more_env: [(env_pair name:LC_ALL val:{(C)} spids:[670])]
                )
              ]
            )
          left_token: <Left_CommandSub "$(">
          spids: [669 680]
        )
      }
    )
    (Case
      to_match: {($ VSub_Star "$*")}
      arms: [
        (case_arm
          pat_list: [{(B)}]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:aware) op:Equal rhs:{(1)} spids:[691])]
              spids: [691]
            )
          ]
          spids: [688 689 694 -1]
        )
      ]
      spids: [682 686 696]
    )
    (C {(rm)} {(-rf)} {(Lit_Other "*")})
    (C {(touch)} {(a)} {(b)} {(c)} {(d)} {(abc)} {(abd)} {(abe)} {(bb)} {(bcd)} {(ca)} {(cb)} {(dd)} {(de)} 
      {(Beware)}
    )
    (C {(mkdir)} {(bdir)})
    (C {(test_glob)} {(SQ <"<a> <abc> <abd> <abe> <X*>">)} {(a) (Lit_Other "*")} {(X) (Lit_Other "*")})
    (C {(test_glob)} {(SQ <"<a> <abc> <abd> <abe>">)} 
      {(EscapedLiteralPart token:<Lit_EscapedChar "\\a">) (Lit_Other "*")}
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Subshell
              child: (C {(set)} {(--nullglob)})
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[772])]
              spids: [764 770]
            )
          ]
          action: [
            (C {(set)} {(--nullglob)})
            (C {(test_glob)} {(SQ <"<a> <abc> <abd> <abe>">)} {(a) (Lit_Other "*")} {(X) (Lit_Other "*")})
            (C {(set)} {(--nonullglob)})
          ]
          spids: [-1 775]
        )
      ]
      spids: [-1 802]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Subshell
              child: (C {(set)} {(--failglob)})
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[815])]
              spids: [807 813]
            )
          ]
          action: [
            (C {(set)} {(--failglob)})
            (C {(mkdir)} {(tmp)})
            (C {(touch)} {(tmp/l1)} {(tmp/l2)} {(tmp/l3)})
            (C {(test_glob)} {(SQ )} {(tmp/l) (Lit_Other "[") (12) (Lit_Other "]")} 
              {(tmp/) (Lit_Other "*") (4)} {(tmp/) (Lit_Other "*") (3)}
            )
            (C {(test_glob)} {(SQ )} {(tmp/l) (Lit_Other "[") (12) (Lit_Other "]")} 
              {(tmp/) (Lit_Other "*") (4)} {(tmp/) (Lit_Other "*") (3)}
            )
            (C {(rm)} {(-r)} {(tmp)})
            (C {(set)} {(--nofailglob)})
          ]
          spids: [-1 818]
        )
      ]
      spids: [-1 891]
    )
    (C {(test_glob)} {(SQ <"<bdir/>">)} {(b) (Lit_Other "*") (/)})
    (C {(test_glob)} {(SQ <"<*>">)} {(EscapedLiteralPart token:<Lit_EscapedChar "\\*">)})
    (C {(test_glob)} {(SQ <"<a*>">)} {(SQ <"a*">)})
    (C {(test_glob)} {(SQ <"<a*>">)} {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">)})
    (C {(test_glob)} {(SQ <"<c> <ca> <cb> <a*> <*q*>">)} {(c) (Lit_Other "*")} 
      {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">)} {(Lit_Other "*") (q) (Lit_Other "*")}
    )
    (C {(test_glob)} {(SQ <"<**>">)} {(DQ ("*")) (Lit_Other "*")})
    (C {(test_glob)} {(SQ <"<**>">)} 
      {(EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (Lit_Other "*")}
    )
    (C {(test_glob)} {(SQ <"<\\.\\./*/>">)} 
      {
        (DQ (EscapedLiteralPart token:<Lit_EscapedChar "\\.">) 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\.">) ("/*/")
        )
      }
    )
    (C {(test_glob)} {(SQ <"<s/\\..*//>">)} {(SQ <"s/\\..*//">)})
    (C {(test_glob)} {(SQ <"</^root:/{s/^[!:]*:[!:]*:\\([!:]*\\).*$/\\1/>">)} 
      {
        (DQ ("/^root:/{s/^[!:]*:[!:]*:") (EscapedLiteralPart token:<Lit_EscapedChar "\\(">) ("[!:]*") 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\)">) (".*")
        ) (SQ <"$">) (DQ (/) (EscapedLiteralPart token:<Lit_EscapedChar "\\1">) (/))
      }
    )
    (C {(test_glob)} {(SQ <"<abc> <abd> <abe> <bb> <cb>">)} 
      {(Lit_Other "[") (a-c) (Lit_Other "]") (b) (Lit_Other "*")}
    )
    (C {(test_glob)} {(Lit_Other "+") (Lit_Other "+") (Beware)} 
      {(SQ <"<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>">)} 
      {(Lit_Other "[") (a-y) (Lit_Other "]") (Lit_Other "*") (Lit_Other "[") (KW_Bang "!") (c) 
        (Lit_Other "]")
      }
    )
    (C {(test_glob)} {(SQ <"<abd> <abe>">)} 
      {(a) (Lit_Other "*") (Lit_Other "[") (KW_Bang "!") (c) (Lit_Other "]")}
    )
    (C {(touch)} {(a-b)} {(aXb)})
    (C {(test_glob)} {(SQ <"<a-b> <aXb>">)} {(a) (Lit_Other "[") (X-) (Lit_Other "]") (b)})
    (C {(touch)} {(.x)} {(.y)})
    (C {(test_glob)} {(--Beware)} {(SQ <"<Beware> <d> <dd> <de>">)} 
      {(Lit_Other "[") (KW_Bang "!") (a-c) (Lit_Other "]") (Lit_Other "*")}
    )
    (If
      arms: [
        (if_arm
          cond: [
            (SimpleCommand
              words: [{(mkdir)} {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (b)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[1106])]
            )
          ]
          action: [
            (C {(touch)} {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (b/ooo)})
            (C {(test_glob)} {(SQ <"<a*b/ooo>">)} 
              {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (b/) (Lit_Other "*")}
            )
            (C {(test_glob)} {(SQ <"<a*b/ooo>">)} 
              {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (Lit_Other "?") (/) 
                (Lit_Other "*")
              }
            )
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <"!7">)} {(SQ <"*\\!*">)})
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <"r.*">)} {(SQ <"*.\\*">)})
            (C {(test_glob)} {(SQ <"<abc>">)} {(a) (Lit_Other "[") (b) (Lit_Other "]") (c)})
            (C {(test_glob)} {(SQ <"<abc>">)} {(a) (Lit_Other "[") (DQ (b)) (Lit_Other "]") (c)})
            (C {(test_glob)} {(SQ <"<abc>">)} 
              {(a) (Lit_Other "[") (EscapedLiteralPart token:<Lit_EscapedChar "\\b">) (Lit_Other "]") 
                (c)
              }
            )
            (C {(test_glob)} {(SQ <"<abc>">)} {(a) (Lit_Other "?") (c)})
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"a\"b\"c">)})
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"a*c">)})
            (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"\"a?c\"">)})
            (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"a\\*c">)})
            (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"a\\[b]c">)})
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <"\"$undefined\"">)} {(SQ <"\"\"">)})
            (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"a[\"\\b\"]c">)})
            (C {(rm)} {(-rf)} {(mkdir)} {(a) (EscapedLiteralPart token:<Lit_EscapedChar "\\*">) (b)})
          ]
          spids: [-1 1109]
        )
      ]
      spids: [-1 1343]
    )
    (C {(mkdir)} {(man)})
    (C {(mkdir)} {(man/man1)})
    (C {(touch)} {(man/man1/sh.1)})
    (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
      {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")}
    )
    (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
      {
        (CommandSubPart
          command_list: 
            (CommandList
              children: [(C {(echo)} {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")})]
            )
          left_token: <Left_CommandSub "$(">
          spids: [1377 1385]
        )
      }
    )
    (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
      {
        (DQ 
          (CommandSubPart
            command_list: 
              (CommandList
                children: [(C {(echo)} {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")})]
              )
            left_token: <Left_CommandSub "$(">
            spids: [1394 1402]
          )
        )
      }
    )
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"a***c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"a*****?c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"?*****??">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"*****??">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"*****??c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"?*****?c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"?***?****c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"?***?****?">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"?***?****">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"*******c">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abc>)} {(SQ <"*******?">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a*cd**?**??k">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a**?**cd**?**??k">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a**?**cd**?**??k***">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a**?**cd**?**??***k">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a**?**cd**?**??***k**">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abcdecdhjk>)} {(SQ <"a****c**?**??*****">)})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'-'"))} {(SQ <"[-abc]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'-'"))} {(SQ <"[abc-]">)})
    (C {(test_case)} {(SQ <"<match>">)} 
      {(DQ ("'") (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("'"))} {(SQ <"\\\\">)}
    )
    (C {(test_case)} {(SQ <"<match>">)} 
      {(DQ ("'") (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("'"))} {(SQ <"[\\\\]">)}
    )
    (C {(test_case)} {(SQ <"<match>">)} 
      {(DQ ("'") (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("'"))} {(DQ ("'") (EscapedLiteralPart token:<Lit_EscapedChar "\\\\">) ("'"))}
    )
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'['"))} {(SQ <"[[]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <"[">)} {(SQ <"[[]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'['"))} {(SQ <"[">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <"[">)} {(SQ <"[">)})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'[abc'"))} {(DQ ("'['*"))})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(DQ ("'[abc'"))} {(SQ <"[*">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <"[abc">)} {(DQ ("'['*"))})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <"[abc">)} {(SQ <"[*">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <abd>)} {(DQ ("a[b/c]d"))})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <a/d>)} {(DQ ("a[b/c]d"))})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <acd>)} {(DQ ("a[b/c]d"))})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("']'"))} {(SQ <"[]]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(DQ ("'-'"))} {(SQ <"[]-]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <p>)} {(SQ <"[a-\\z]">)})
    (C {(test_case)} {(SQ <"<match>">)} {(SQ <"\"/tmp\"">)} {(SQ <"[/\\\\]*">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"??**********?****?">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"??**********?****c">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"?************c****?****">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"*c*?**">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"a*****c*?**">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <abc>)} {(SQ <"a********???*******">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(DQ ("'a'"))} {(SQ <"[]">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <a>)} {(SQ <"[]">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(DQ ("'['"))} {(SQ <"[abc">)})
    (C {(test_case)} {(SQ <"<nomatch>">)} {(SQ <"[">)} {(SQ <"[abc">)})
    (C {(test_glob)} {(Lit_Other "+") (Lit_Other "+") (Beware)} {(SQ <"<b> <bb> <bcd> <bdir>">)} 
      {(b) (Lit_Other "*")}
    )
    (C {(test_glob)} {(SQ <"<Beware> <b> <bb> <bcd> <bdir>">)} 
      {(Lit_Other "[") (bB) (Lit_Other "]") (Lit_Other "*")}
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Subshell
              child: (C {(set)} {(--nocaseglob)})
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2108])]
              spids: [2100 2106]
            )
          ]
          action: [
            (C {(set)} {(--nocaseglob)})
            (C {(test_glob)} {(SQ <"<Beware> <b> <bb> <bcd> <bdir>">)} {(b) (Lit_Other "*")})
            (C {(test_glob)} {(SQ <"<Beware> <b> <bb> <bcd> <bdir>">)} 
              {(Lit_Other "[") (b) (Lit_Other "]") (Lit_Other "*")}
            )
            (C {(test_glob)} {(SQ <"<Beware> <b> <bb> <bcd> <bdir>">)} 
              {(Lit_Other "[") (bB) (Lit_Other "]") (Lit_Other "*")}
            )
            (C {(set)} {(--nonocaseglob)})
          ]
          spids: [-1 2111]
        )
      ]
      spids: [-1 2159]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Subshell
              child: (C {(set)} {(-f)})
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2172])]
              spids: [2164 2170]
            )
          ]
          action: [
            (C {(set)} {(-f)})
            (C {(test_glob)} {(SQ <"<*>">)} {(Lit_Other "*")})
            (C {(set)} {(Lit_Other "+") (f)})
          ]
          spids: [-1 2175]
        )
      ]
      spids: [-1 2199]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Subshell
              child: (C {(set)} {(--noglob)})
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2212])]
              spids: [2204 2210]
            )
          ]
          action: [
            (C {(set)} {(--noglob)})
            (C {(test_glob)} {(SQ <"<*>">)} {(Lit_Other "*")})
            (C {(set)} {(--glob)})
          ]
          spids: [-1 2215]
        )
      ]
      spids: [-1 2238]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:FIGNORE) op:Equal rhs:{(SQ <"@(.*|*)">)} spids:[2241])]
      spids: [2241]
    )
    (C {(test_glob)} {(SQ <"<*>">)} {(Lit_Other "*")})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:FIGNORE)
          op: Equal
          rhs: {(SQ <"@(.*|*c|*e|?)">)}
          spids: [2255]
        )
      ]
      spids: [2255]
    )
    (C {(test_glob)} {(SQ <"<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>">)} 
      {(Lit_Other "*")}
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:FIGNORE)
          op: Equal
          rhs: {(SQ <"@(.*|*b|*d|?)">)}
          spids: [2269]
        )
      ]
      spids: [2269]
    )
    (C {(test_glob)} {(SQ <"<Beware> <abc> <abe> <bdir> <ca> <de> <man>">)} {(Lit_Other "*")})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:FIGNORE) op:Equal rhs:{(SQ )} spids:[2283])]
      spids: [2283]
    )
    (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
      {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")}
    )
    (C {(unset)} {(FIGNORE)})
    (C {(test_glob)} {(SQ <"<bb> <ca> <cb> <dd> <de>">)} {(Lit_Other "?") (Lit_Other "?")})
    (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
      {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")}
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:GLOBIGNORE) op:Equal rhs:{(SQ <".*:*">)} spids:[2324])]
      spids: [2324]
    )
    (C {(set)} {(--)} {(Lit_Other "*")})
    (If
      arms: [
        (if_arm
          cond: [
            (DBracket
              expr: 
                (BoolBinary
                  op_id: BoolBinary_GlobDEqual
                  left: {($ VSub_Number "$1")}
                  right: {(SQ <"*">)}
                )
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:GLOBIGNORE)
                  op: Equal
                  rhs: {(SQ <".*:*c:*e:?">)}
                  spids: [2352]
                )
              ]
              spids: [2352]
            )
            (C {(test_glob)} {(SQ <"<>">)} {(Lit_Other "*")})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:GLOBIGNORE)
                  op: Equal
                  rhs: {(SQ <".*:*b:*d:?">)}
                  spids: [2368]
                )
              ]
              spids: [2368]
            )
            (C {(test_glob)} {(SQ <"<>">)} {(Lit_Other "*")})
            (C {(unset)} {(GLOBIGNORE)})
            (C {(test_glob)} {(SQ <"<>">)} {(Lit_Other "*")})
            (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
              {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")}
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:GLOBIGNORE) op:Equal rhs:{(SQ )} spids:[2412])]
              spids: [2412]
            )
            (C {(test_glob)} {(SQ <"<man/man1/sh.1>">)} 
              {(Lit_Other "*") (/man) (Lit_Other "*") (/sh.) (Lit_Other "*")}
            )
          ]
          spids: [-1 2349]
        )
      ]
      spids: [-1 2427]
    )
    (C {(unset)} {(GLOBIGNORE)})
    (FuncDef
      name: test_sub
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:x)
                  op: Equal
                  rhs: {(SQ <"${subject">) ($ VSub_Number "$2") (SQ <"}">)}
                  spids: [2441]
                )
              ]
              spids: [2441]
            )
            (C {(eval)} {(Lit_VarLike "g=") ($ VSub_Name "$x")})
            (If
              arms: [
                (if_arm
                  cond: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobNEqual
                          left: {(DQ ($ VSub_Name "$g"))}
                          right: {(DQ ($ VSub_Number "$3"))}
                        )
                    )
                  ]
                  action: [
                    (C {(SQ <err_exit>)} {($ VSub_Number "$1")} 
                      {(Lit_VarLike "subject=") 
                        (DQ ("'") ($ VSub_Name "$subject") ("' ") ($ VSub_Name "$x") 
                          (" failed, expected '") ($ VSub_Number "$3") ("', got '") ($ VSub_Name "$g") ("'")
                        )
                      }
                    )
                  ]
                  spids: [-1 2474]
                )
              ]
              spids: [-1 2496]
            )
          ]
          spids: [2438]
        )
      spids: [2434 2437]
    )
    (C {(alias)} {(Lit_VarLike "test_sub=") (SQ <"test_sub $LINENO">)})
    (C {(set)} {(--noglob)} {(--nobraceexpand)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:subject)
          op: Equal
          rhs: {(SQ <"A regular expressions test">)}
          spids: [2515]
        )
      ]
      spids: [2515]
    )
    (C {(test_sub)} {(SQ <"/e/#">)} {(SQ <"A r#gular expressions test">)})
    (C {(test_sub)} {(SQ <"//e/#">)} {(SQ <"A r#gular #xpr#ssions t#st">)})
    (C {(test_sub)} {(SQ <"/[^e]/#">)} {(SQ <"# regular expressions test">)})
    (C {(test_sub)} {(SQ <"//[^e]/#">)} {(SQ <"###e######e###e########e##">)})
    (C {(test_sub)} {(SQ <"/+(e)/#">)} {(SQ <"A r#gular expressions test">)})
    (C {(test_sub)} {(SQ <"//+(e)/#">)} {(SQ <"A r#gular #xpr#ssions t#st">)})
    (C {(test_sub)} {(SQ <"/@-(e)/#">)} {(SQ <"A r#gular expressions test">)})
    (C {(test_sub)} {(SQ <"//@-(e)/#">)} {(SQ <"A r#gular #xpr#ssions t#st">)})
    (C {(test_sub)} {(SQ <"/?(e)/#">)} {(SQ <"#A regular expressions test">)})
    (C {(test_sub)} {(SQ <"//?(e)/#">)} {(SQ <"#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#">)})
    (C {(test_sub)} {(SQ <"/*(e)/#">)} {(SQ <"#A regular expressions test">)})
    (C {(test_sub)} {(SQ <"//*(e)/#">)} {(SQ <"#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#">)})
    (C {(test_sub)} {(SQ <"//@(e)/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//@-(e)/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//+(e)/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//+-(e)/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//@(+(e))/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//@(+-(e))/[\\1]">)} {(SQ <"A r[e]gular [e]xpr[e]ssions t[e]st">)})
    (C {(test_sub)} {(SQ <"//-(e)/#">)} {(SQ <"A regular expressions test">)})
    (C {(test_sub)} {(SQ <"//--(e)/#">)} {(SQ <"A regular expressions test">)})
    (C {(test_sub)} {(SQ <"//?(e)/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//{0,1}(e)/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//*(e)/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//{0,}(e)/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//@(?(e))/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//@({0,1}(e))/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//@(*(e))/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"//@({0,}(e))/[\\1]">)} 
      {(SQ <"[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]">)}
    )
    (C {(test_sub)} {(SQ <"/?-(e)/#">)} {(SQ <"#A regular expressions test">)})
    (C {(test_sub)} {(SQ <"/@(?-(e))/[\\1]">)} {(SQ <"[]A regular expressions test">)})
    (C {(test_sub)} {(SQ <"/!(e)/#">)} {(SQ <"#">)})
    (C {(test_sub)} {(SQ <"//!(e)/#">)} {(SQ <"#">)})
    (C {(test_sub)} {(SQ <"/@(!(e))/[\\1]">)} {(SQ <"[A regular expressions test]">)})
    (C {(test_sub)} {(SQ <"//@(!(e))/[\\1]">)} {(SQ <"[A regular expressions test]">)})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:subject) op:Equal rhs:{(SQ <e>)} spids:[2862])]
      spids: [2862]
    )
    (C {(test_sub)} {(SQ <"/!(e)/#">)} {(SQ <"#e">)})
    (C {(test_sub)} {(SQ <"//!(e)/#">)} {(SQ <"#e#">)})
    (C {(test_sub)} {(SQ <"/!(e)/[\\1]">)} {(SQ <"[]e">)})
    (C {(test_sub)} {(SQ <"//!(e)/[\\1]">)} {(SQ <"[]e[]">)})
    (C {(test_sub)} {(SQ <"/@(!(e))/[\\1]">)} {(SQ <"[]e">)})
    (C {(test_sub)} {(SQ <"//@(!(e))/[\\1]">)} {(SQ <"[]e[]">)})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:subject) op:Equal rhs:{(SQ <a>)} spids:[2929])]
      spids: [2929]
    )
    (C {(test_sub)} {(SQ <"/@(!(a))/[\\1]">)} {(SQ <"[]a">)})
    (C {(test_sub)} {(SQ <"//@(!(a))/[\\1]">)} {(SQ <"[]a[]">)})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:subject) op:Equal rhs:{(SQ <aha>)} spids:[2956])]
      spids: [2956]
    )
    (C {(test_sub)} {(SQ <"/@(!(a))/[\\1]">)} {(SQ <"[aha]">)})
    (C {(test_sub)} {(SQ <"//@(!(a))/[\\1]">)} {(SQ <"[aha]">)})
    (C {(test_sub)} {(SQ <"/@(!(aha))/[\\1]">)} {(SQ <"[ah]a">)})
    (C {(test_sub)} {(SQ <"//@(!(aha))/[\\1]">)} {(SQ <"[ah][a]">)})
    (C {(exit)} 
      {
        (ArithSubPart
          anode: 
            (TernaryOp
              cond: 
                (ArithBinary
                  op_id: Arith_Less
                  left: (ArithVarRef name:Errors)
                  right: (ArithWord w:{(Lit_Digits 125)})
                )
              true_expr: (ArithVarRef name:Errors)
              false_expr: (ArithWord w:{(Lit_Digits 125)})
            )
          spids: [3005 3014]
        )
      }
    )
  ]
)