(command.CommandList
  children: [
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Pound '$#'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <2>)} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Subshell
              child: 
                (C {<echo>} 
                  {
                    (DQ <'\n'> <'Usage: '> 
                      (command_sub
                        left_token: <Id.Left_Backtick '`'>
                        child: (C {<basename>} {($ Id.VSub_Number '$0')})
                      ) <' <size> <path>\n'> <'\n'> <'Truncate the <path> to exactly <size> bytes.\n'> <'\n'> 
                      <'If <path> doesn\'t exist it is created.\n'> <'\n'> <'<size> is a number which may be optionally followed\n'> 
                      <'by the following multiplicative suffixes:\n'> <'  b              512\n'> <'  KB            1000\n'> <'  K             1024\n'> 
                      <'  MB       1000*1000\n'> <'  M        1024*1024\n'> <'and so on for G, T, P, E, Z, Y\n'> <'\n'> 
                      <'If the file previously was larger than this size, the extra data is\n'> <'lost. If the file previously was shorter, it is extended\n'> 
                      <'and the extended part reads as zero bytes. Note in both cases\n'> <'no data is written (if the filesystem supports holes in files).\n'> <'\n'> 
                      <'E.G.: truncate 2TB ext3.test\n'>
                    )
                  }
                )
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [39 57]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:size)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [112]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:file)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_Number '$2'))}
          spids: [115]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:error)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_Backtick '`'>
                child: 
                  (command.Simple
                    words: [
                      {<dd>}
                      {<Id.Lit_VarLike 'bs='> <1>}
                      {<Id.Lit_VarLike 'seek='> ($ Id.VSub_DollarName '$size')}
                      {<Id.Lit_VarLike 'if='> <'/dev/null'>}
                      {<Id.Lit_VarLike 'of='> (DQ ($ Id.VSub_DollarName '$file'))}
                    ]
                    redirects: [(redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})]
                    do_fork: T
                  )
              )
            }
          spids: [121]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ret)
          op: assign_op.Equal
          rhs: {($ Id.VSub_QMark '$?')}
          spids: [145]
        )
      ]
    )
    (command.Pipeline
      children: [
        (C {<echo>} {(DQ ($ Id.VSub_DollarName '$error'))})
        (command.Simple
          words: [{<grep>} {<-v>} {(DQ <'^0'>)}]
          redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
          do_fork: T
        )
      ]
      negated: F
    )
    (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{($ Id.VSub_DollarName '$ret')})
  ]
)