(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'quoted output' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:FN)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'\xe6\xbf\xb1\xe9\x87\x8e' span_id:26))}
          spids: [24]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GN)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'\xe7\xb4\x94' span_id:31))}
          spids: [29]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HT)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'\t' span_id:36))}
          spids: [34]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DQ)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'"' span_id:41))}
          spids: [39]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(test_have_prereq)} {(MINGW)})
        (command.Simple
          words: [{(echo)} {(foo)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'2>' span_id:55)
              fd: 2
              arg_word: {(/dev/null)}
            )
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:58)
              fd: -1
              arg_word: {(DQ ('Name and an') (${ Id.VSub_Name HT) (HT))}
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Pipeline
              children: [(C {(test)} {(-f)} {(DQ ('Name and an') (${ Id.VSub_Name HT) (HT))})]
              negated: T
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (SQ 
                        (Token
                          id: Id.Lit_Chars
                          val: 'Your filesystem does not allow tabs in filenames'
                          span_id: 93
                        )
                      )
                    }
                  spids: [91]
                )
              ]
            )
            (C {(test_done)})
          ]
          spids: [68 84]
        )
      ]
    )
    (command.ShFunction
      name: for_each_name
      body: 
        (command.BraceGroup
          children: [
            (command.ForEach
              iter_name: name
              iter_words: [
                {(Name)}
                {(DQ ('Name and a') (${ Id.VSub_Name LF) (LF))}
                {(DQ ('Name and an') (${ Id.VSub_Name HT) (HT))}
                {(DQ (Name) (${ Id.VSub_Name DQ))}
                {
                  (DQ ($ Id.VSub_DollarName '$FN') ($ Id.VSub_DollarName '$HT') 
                    ($ Id.VSub_DollarName '$GN')
                  )
                }
                {
                  (DQ ($ Id.VSub_DollarName '$FN') ($ Id.VSub_DollarName '$LF') 
                    ($ Id.VSub_DollarName '$GN')
                  )
                }
                {(DQ ($ Id.VSub_DollarName '$FN') (' ') ($ Id.VSub_DollarName '$GN'))}
                {(DQ ($ Id.VSub_DollarName '$FN') ($ Id.VSub_DollarName '$GN'))}
                {
                  (DQ ($ Id.VSub_DollarName '$FN') ($ Id.VSub_DollarName '$DQ') 
                    ($ Id.VSub_DollarName '$GN')
                  )
                }
                {(DQ ('With SP in it'))}
                {(DQ ($ Id.VSub_DollarName '$FN') (/file))}
              ]
              do_arg_iter: F
              body: (command.DoGroup children:[(C {(eval)} {(DQ ($ Id.VSub_Number '$1'))})])
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:204))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:208) (Token id:Id.Lit_Chars val:'\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\tmkdir "$FN" &&\n' span_id:210) (Token id:Id.Lit_Chars val:'\tfor_each_name "echo initial >\\"\\$name\\"" &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\tgit add . &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\tgit commit -q -m Initial &&\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'\n' span_id:214) (Token id:Id.Lit_Chars val:'\tfor_each_name "echo second >\\"\\$name\\"" &&\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m Second &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\n' span_id:217) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor_each_name "echo modified >\\"\\$name\\""\n'
            span_id: 218
          ) (Token id:Id.Lit_Chars val:'\n' span_id:219)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup expected files' span_id:226))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:230) 
          (Token id:Id.Lit_Chars val:'cat >expect.quoted <<\\EOF &&\n' span_id:231) (Token id:Id.Lit_Chars val:'Name\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'"Name and a\\nLF"\n' span_id:233) (Token id:Id.Lit_Chars val:'"Name and an\\tHT"\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'"Name\\""\n' span_id:235) (Token id:Id.Lit_Chars val:'With SP in it\n' span_id:236) 
          (Token
            id: Id.Lit_Chars
            val: '"\\346\\277\\261\\351\\207\\216\\t\\347\\264\\224"\n'
            span_id: 237
          ) (Token id:Id.Lit_Chars val:'"\\346\\277\\261\\351\\207\\216\\n\\347\\264\\224"\n' span_id:238) 
          (Token
            id: Id.Lit_Chars
            val: '"\\346\\277\\261\\351\\207\\216 \\347\\264\\224"\n'
            span_id: 239
          ) (Token id:Id.Lit_Chars val:'"\\346\\277\\261\\351\\207\\216\\"\\347\\264\\224"\n' span_id:240) 
          (Token id:Id.Lit_Chars val:'"\\346\\277\\261\\351\\207\\216/file"\n' span_id:241) (Token id:Id.Lit_Chars val:'"\\346\\277\\261\\351\\207\\216\\347\\264\\224"\n' span_id:242) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:243) (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'cat >expect.raw <<\\EOF\n' span_id:245) (Token id:Id.Lit_Chars val:'Name\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'"Name and a\\nLF"\n' span_id:247) (Token id:Id.Lit_Chars val:'"Name and an\\tHT"\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'"Name\\""\n' span_id:249) (Token id:Id.Lit_Chars val:'With SP in it\n' span_id:250) 
          (Token
            id: Id.Lit_Chars
            val: '"\xe6\xbf\xb1\xe9\x87\x8e\\t\xe7\xb4\x94"\n'
            span_id: 251
          ) (Token id:Id.Lit_Chars val:'"\xe6\xbf\xb1\xe9\x87\x8e\\n\xe7\xb4\x94"\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\xe6\xbf\xb1\xe9\x87\x8e \xe7\xb4\x94\n' span_id:253) (Token id:Id.Lit_Chars val:'"\xe6\xbf\xb1\xe9\x87\x8e\\"\xe7\xb4\x94"\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\xe6\xbf\xb1\xe9\x87\x8e/file\n' span_id:255) (Token id:Id.Lit_Chars val:'\xe6\xbf\xb1\xe9\x87\x8e\xe7\xb4\x94\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:257)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from ls-files' span_id:264))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) (Token id:Id.Lit_Chars val:'\n' span_id:269) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files >current && test_cmp expect.quoted current\n'
            span_id: 270
          ) (Token id:Id.Lit_Chars val:'\n' span_id:271)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-files' span_id:278))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:282) (Token id:Id.Lit_Chars val:'\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\tgit diff --name-only >current &&\n' span_id:284) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.quoted current\n' span_id:285) 
          (Token id:Id.Lit_Chars val:'\n' span_id:286)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-index' span_id:293))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:297) (Token id:Id.Lit_Chars val:'\n' span_id:298) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --name-only HEAD >current &&\n'
            span_id: 299
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.quoted current\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\n' span_id:301)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-tree' span_id:308))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:312) (Token id:Id.Lit_Chars val:'\n' span_id:313) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --name-only HEAD^ HEAD >current &&\n'
            span_id: 314
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.quoted current\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\n' span_id:316)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from ls-tree' span_id:323))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:327) (Token id:Id.Lit_Chars val:'\n' span_id:328) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-tree --name-only -r HEAD >current &&\n'
            span_id: 329
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.quoted current\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\n' span_id:331)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setting core.quotepath' span_id:338))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) (Token id:Id.Lit_Chars val:'\n' span_id:343) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --bool core.quotepath false\n'
            span_id: 344
          ) (Token id:Id.Lit_Chars val:'\n' span_id:345)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from ls-files' span_id:352))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:356) (Token id:Id.Lit_Chars val:'\n' span_id:357) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files >current && test_cmp expect.raw current\n'
            span_id: 358
          ) (Token id:Id.Lit_Chars val:'\n' span_id:359)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-files' span_id:366))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) (Token id:Id.Lit_Chars val:'\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\tgit diff --name-only >current &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.raw current\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\n' span_id:374)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-index' span_id:381))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:385) (Token id:Id.Lit_Chars val:'\n' span_id:386) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --name-only HEAD >current &&\n'
            span_id: 387
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.raw current\n' span_id:388) 
          (Token id:Id.Lit_Chars val:'\n' span_id:389)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from diff-tree' span_id:396))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:400) (Token id:Id.Lit_Chars val:'\n' span_id:401) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --name-only HEAD^ HEAD >current &&\n'
            span_id: 402
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.raw current\n' span_id:403) 
          (Token id:Id.Lit_Chars val:'\n' span_id:404)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check fully quoted output from ls-tree' span_id:411))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:415) (Token id:Id.Lit_Chars val:'\n' span_id:416) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-tree --name-only -r HEAD >current &&\n'
            span_id: 417
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.raw current\n' span_id:418) 
          (Token id:Id.Lit_Chars val:'\n' span_id:419)
        )
      }
    )
    (C {(test_done)})
  ]
)