(command.CommandList
  children: [
    (C {<set>} {<-o>} {<errexit>})
    (C {<set>} {<-o>} {<nounset>})
    (C {<set>} {<-o>} {<pipefail>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:KUBE_ROOT)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<dirname>} {(DQ (${ Id.VSub_Name BASH_SOURCE))})
              ) <'/..'>
            }
          spids: [63]
        )
      ]
    )
    (C {<source>} {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/hack/lib/init.sh'>)})
    (C 
      {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <golang> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
        <setup_env>
      }
    )
    (C {<make>} {<-C>} {(DQ (${ Id.VSub_Name KUBE_ROOT))} {<Id.Lit_VarLike 'WHAT='> <'cmd/linkcheck'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:linkcheck)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (C 
                    {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <util> <Id.Lit_Colon ':'> 
                      <Id.Lit_Colon ':'> <find-binary>
                    } {(DQ <linkcheck>)}
                  )
              )
            }
          spids: [108]
        )
      ]
    )
    (C 
      {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <util> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
        <ensure-temp-dir>
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:OUTPUT)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name KUBE_TEMP)) <'/linkcheck-output'>}
          spids: [132]
        )
      ]
    )
    (command.ShFunction
      name: cleanup
      body: (BraceGroup children:[(C {<rm>} {<-rf>} {(DQ (${ Id.VSub_Name OUTPUT))})])
    )
    (C {<trap>} {(DQ <cleanup>)} {<EXIT>} {<SIGINT>})
    (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$OUTPUT'))})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:APIROOT)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/pkg/api/'>)}
          spids: [178]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:APISROOT)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/pkg/apis/'>)}
          spids: [186]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DOCROOT)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/docs/'>)}
          spids: [194]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ROOTS)
          op: assign_op.Equal
          rhs: 
            {
              (sh_array_literal
                left: <Id.Op_LParen _>
                words: [
                  {($ Id.VSub_DollarName '$APIROOT')}
                  {($ Id.VSub_DollarName '$APISROOT')}
                  {($ Id.VSub_DollarName '$DOCROOT')}
                ]
              )
            }
          spids: [202]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:found_invalid)
          op: assign_op.Equal
          rhs: {<false>}
          spids: [211]
        )
      ]
    )
    (command.ForEach
      iter_name: root
      iter_words: [
        {
          (DQ 
            (braced_var_sub
              token: <Id.VSub_Name ROOTS>
              bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
            )
          )
        }
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (command.Simple
                  words: [
                    {(DQ (${ Id.VSub_Name linkcheck))}
                    {(DQ <'--root-dir='> (${ Id.VSub_Name root))}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: 
                        {
                          (command_sub
                            left_token: <Id.Left_ProcSubOut '>('>
                            child: 
                              (command.Simple
                                words: [{<tee>} {<-a>} {(DQ (${ Id.VSub_Name OUTPUT) <'/error'>)}]
                                redirects: [
                                  (redir
                                    op: <Id.Redir_GreatAnd '>&'>
                                    loc: (redir_loc.Fd fd:1)
                                    arg: {<2>}
                                  )
                                ]
                                do_fork: T
                              )
                          )
                        }
                    )
                  ]
                  do_fork: T
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ret)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [266]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ret)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '$?')}
                      spids: [271]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {($ Id.VSub_DollarName '$ret')}
                                  right: {<1>}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'Failed: found invalid links in '> (${ Id.VSub_Name root) <.>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:found_invalid)
                          op: assign_op.Equal
                          rhs: {<true>}
                          spids: [302]
                        )
                      ]
                    )
                  ]
                  spids: [275 288]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_gt
                                  left: {($ Id.VSub_DollarName '$ret')}
                                  right: {<1>}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'Error running linkcheck'>)})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [309 322]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name found_invalid)} {<Id.Lit_Equals '='>} 
                      {<true>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<echo>} {(DQ <'Summary of invalid links:'>)})
            (C {<cat>} {(${ Id.VSub_Name OUTPUT) <'/error'>})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [342 357]
        )
      ]
    )
  ]
)