(command.CommandList children: [ (C {<mkdir>} {<service>} {<svc0>} {<svc1>} {<svc2>} {<'svc2/log'>}) (command.Simple words: [{<catexe>} {<'svc0/run'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 26 stdin_parts: [<'#!/bin/sh\n'> <'echo svc0 ran >> output\n'>] ) ) ] do_fork: T ) (command.Simple words: [{<catexe>} {<'svc1/run'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 38 stdin_parts: [<'#!/bin/sh\n'> <'echo svc1 ran\n'>] ) ) ] do_fork: T ) (command.Simple words: [{<catexe>} {<'svc1/log'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 50 stdin_parts: [<'#!/bin/sh\n'> <'exec cat > output\n'>] ) ) ] do_fork: T ) (command.Simple words: [{<catexe>} {<'svc2/run'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 62 stdin_parts: [<'#!/bin/sh\n'> <'echo svc2 ran\n'>] ) ) ] do_fork: T ) (command.Simple words: [{<catexe>} {<'svc2/log/run'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 74 stdin_parts: [<'#!/bin/sh\n'> <'exec cat > ../output\n'>] ) ) ] do_fork: T ) (C {<ln>} {<-s>} {(command_sub left_token:<Id.Left_Backtick '`'> child:(C {<pwd>})) <'/svc'> <Id.Lit_LBracket '['> <0-9> <Id.Lit_RBracket ']'> } {<'service/'>} ) (command.Sentence child: (command.Simple words: [ {<svscan>} {(command_sub left_token:<Id.Left_Backtick '`'> child:(C {<pwd>})) <'/service'>} ] redirects: [ (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<svscan.log>}) (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>}) ] do_fork: T ) terminator: <Id.Op_Amp _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:svscanpid) op: assign_op.Equal rhs: {($ Id.VSub_Bang '$!')} spids: [110] ) ] ) (command.WhileUntil keyword: <Id.KW_Until until> cond: (condition.Shell commands: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {<svok>} {<svc0>}) (C {<svok>} {<svc1>}) (C {<svok>} {<svc2>}) (C {<svok>} {<'svc2/log'>}) ] ) ] ) body: (command.DoGroup children:[(C {<sleep>} {<1>})]) ) (C {<kill>} {($ Id.VSub_DollarName '$svscanpid')}) (command.Simple words: [{<wait>}] redirects: [ (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>}) (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>}) ] do_fork: T ) (C {<svc>} {<-dx>} {<Id.Lit_ArrayLhsOpen 'svc['> <0-9> <Id.Lit_RBracket ']'>} {<'svc2/log'>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.AndOr ops: [Id.Op_DPipe Id.Op_DPipe Id.Op_DPipe] children: [ (C {<svok>} {<svc0>}) (C {<svok>} {<svc1>}) (C {<svok>} {<svc2>}) (C {<svok>} {<'svc2/log'>}) ] ) ] ) body: (command.DoGroup children:[(C {<sleep>} {<1>})]) ) (C {<head>} {<-n>} {<1>} {<Id.Lit_ArrayLhsOpen 'svc['> <0-9> <Id.Lit_RBracket ']'> <'/output'>}) (C {<cat>} {<svscan.log>}) (C {<rm>} {<-r>} {<svc0>} {<svc1>} {<svc2>} {<service>}) ] )