(command.CommandList children: [ (C {<source>} {<'sources/utility_functions.sh'>}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-lt>} {<1>} {<Id.Lit_RBracket ']'>}) ] ) action: [ (command.Simple words: [{<echo>} {(DQ <'Usage: timeout.sh SECONDS COMMANDS...'>)}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [23 35] ) ] ) (C {<trap>} {(DQ <'killtree '> ($ Id.VSub_Dollar '$$'))} {<EXIT>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:TIMEOUT) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [64] ) ] ) (C {<shift>}) (command.Pipeline children: [ (command.Subshell child:(C {<eval>} {(DQ ($ Id.VSub_At '$@'))})) (C {<tee>} { (command_sub left_token: <Id.Left_ProcSubOut '>('> child: (command.CommandList children: [ (command.Sentence child: (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<-t>} {(DQ ($ Id.VSub_DollarName '$TIMEOUT'))} {<-n>} {<32>} {<i>} ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Sentence child: (C {<true>}) terminator: <Id.Op_Semi _> ) ] ) ) terminator: <Id.Op_Semi _> ) (command.Sentence child: (C {<sleep>} {<1>}) terminator: <Id.Op_Semi _> ) (command.Simple words: [{<kill>} {<-TERM>} {($ Id.VSub_Dollar '$$')}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) ] ) ) } ) ] negated: F ) ] )