(command.CommandList children: [ (C {(mkdir)} {(service)} {(svc0)} {(svc1)} {(svc2)} {(svc2/log)}) (command.Simple words: [{(catexe)} {(svc0/run)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:20) fd: -1 here_begin: {(EOF)} here_end_span_id: 26 stdin_parts: [('#!/bin/sh\n') ('echo svc0 ran >> output\n')] ) ] ) (command.Simple words: [{(catexe)} {(svc1/run)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:32) fd: -1 here_begin: {(EOF)} here_end_span_id: 38 stdin_parts: [('#!/bin/sh\n') ('echo svc1 ran\n')] ) ] ) (command.Simple words: [{(catexe)} {(svc1/log)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:44) fd: -1 here_begin: {(EOF)} here_end_span_id: 50 stdin_parts: [('#!/bin/sh\n') ('exec cat > output\n')] ) ] ) (command.Simple words: [{(catexe)} {(svc2/run)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:56) fd: -1 here_begin: {(EOF)} here_end_span_id: 62 stdin_parts: [('#!/bin/sh\n') ('echo svc2 ran\n')] ) ] ) (command.Simple words: [{(catexe)} {(svc2/log/run)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:68) fd: -1 here_begin: {(EOF)} here_end_span_id: 74 stdin_parts: [('#!/bin/sh\n') ('exec cat > ../output\n')] ) ] ) (C {(ln)} {(-s)} { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:80) command_list: (command.CommandList children:[(C {(pwd)})]) ) (/svc) (Id.Lit_LBracket '[') (0-9) (Id.Lit_RBracket ']') } {(service/)} ) (command.Sentence child: (command.Simple words: [ {(svscan)} { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:95) command_list: (command.CommandList children:[(C {(pwd)})]) ) (/service) } ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:102) fd: -1 arg_word: {(svscan.log)} ) (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:105) fd: 2 arg_word: {(1)} ) ] ) terminator: (Token id:Id.Op_Amp val:'&' span_id:108) ) (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: (Token id:Id.KW_Until val:until span_id:114) cond: [ (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.Redir op: (Token id:Id.Redir_Great val:'>' span_id:157) fd: -1 arg_word: {(/dev/null)} ) (redir.Redir op:(Token id:Id.Redir_GreatAnd val:'2>&' span_id:160) fd:2 arg_word:{(1)}) ] ) (C {(svc)} {(-dx)} {(Id.Lit_ArrayLhsOpen 'svc[') (0-9) (Id.Lit_RBracket ']')} {(svc2/log)}) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:174) cond: [ (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)}) ] )