(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tid) op: assign_op.Equal rhs: {(DQ <'sftp glob'>)} spids: [7] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<config_defined>} {<FILESYSTEM_NO_BACKSLASH>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:nobs) op: assign_op.Equal rhs: {(DQ <'not supported on this platform'>)} spids: [19] ) ] ) ] ) (command.ShFunction name: sftp_ls body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:target) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [32] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:errtag) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [36] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expected) op: assign_op.Equal rhs: {($ Id.VSub_Number '$3')} spids: [40] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:unexpected) op: assign_op.Equal rhs: {($ Id.VSub_Number '$4')} spids: [44] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:skip) op: assign_op.Equal rhs: {($ Id.VSub_Number '$5')} spids: [48] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<test>} {(DQ <x> ($ Id.VSub_DollarName '$skip'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <x>)} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<verbose>} { (DQ ($ Id.VSub_DollarName '$tid') <': '> ($ Id.VSub_DollarName '$errtag') <' (skipped: '> ($ Id.VSub_DollarName '$skip') <')'> ) } ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [52 70] ) ] ) (C {<verbose>} {(DQ ($ Id.VSub_DollarName '$tid') <': '> ($ Id.VSub_DollarName '$errtag'))}) (command.Pipeline children: [ (C {<printf>} {(DQ <'ls -l %s'>)} {(DQ (${ Id.VSub_Name target))}) (command.Simple words: [{(${ Id.VSub_Name SFTP)} {<-b>} {<->} {<-D>} {(${ Id.VSub_Name SFTPSERVER)}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) (command.Simple words: [{<grep>} {<-v>} {(DQ <'^sftp>'>)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name RESULTS)} ) ] do_fork: T ) ] negated: F ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<fail>} {(DQ ($ Id.VSub_DollarName '$errtag') <' failed'>)})] spids: [152 165] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<test>} {(DQ <x> ($ Id.VSub_DollarName '$expected'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <x>)} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple words: [ {<fgrep>} {(DQ ($ Id.VSub_DollarName '$expected'))} {(${ Id.VSub_Name RESULTS)} ] 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 ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<Id.Lit_Colon ':'>})] spids: [200 220] ) ] else_action: [ (C {<fail>} { (DQ ($ Id.VSub_DollarName '$expected') <' missing from '> ($ Id.VSub_DollarName '$errtag') <' results'> ) } ) ] ) ] spids: [179 197] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<test>} {(DQ <x> ($ Id.VSub_DollarName '$unexpected'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <x>)} ) (command.Simple words: [ {<fgrep>} {(DQ ($ Id.VSub_DollarName '$unexpected'))} {(${ Id.VSub_Name RESULTS)} ] 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 ) ] ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<fail>} { (DQ ($ Id.VSub_DollarName '$unexpected') <' present in '> ($ Id.VSub_DollarName '$errtag') <' results'> ) } ) ] spids: [245 283] ) ] ) (C {<rm>} {<-f>} {(${ Id.VSub_Name RESULTS)}) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:BASE) op: assign_op.Equal rhs: {(${ Id.VSub_Name OBJ) <'/glob'>} spids: [310] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULTS) op: assign_op.Equal rhs: {(${ Id.VSub_Name OBJ) <'/results'>} spids: [316] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:DIR) op: assign_op.Equal rhs: {(${ Id.VSub_Name BASE) <'/dir'>} spids: [322] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:DATA) op: assign_op.Equal rhs: {(${ Id.VSub_Name DIR) <'/file'>} spids: [328] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GLOB1) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name DIR) <'/g-wild*'>)} spids: [335] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GLOB2) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name DIR) <'/g-wildx'>)} spids: [343] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:QUOTE) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name DIR) <'/g-quote'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } spids: [351] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SLASH) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name DIR) <'/g-sl'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <ash> ) } spids: [360] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ESLASH) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name DIR) <'/g-slash'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) ) } spids: [370] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:QSLASH) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name DIR) <'/g-qs'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } spids: [379] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SPACE) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name DIR) <'/g-q space'>)} spids: [389] ) ] ) (C {<rm>} {<-rf>} {(${ Id.VSub_Name BASE)}) (C {<mkdir>} {<-p>} {(${ Id.VSub_Name DIR)}) (C {<touch>} {(DQ (${ Id.VSub_Name DATA))} {(DQ (${ Id.VSub_Name GLOB1))} {(DQ (${ Id.VSub_Name GLOB2))} {(DQ (${ Id.VSub_Name QUOTE))} {(DQ (${ Id.VSub_Name SPACE))} ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<test>} {(DQ <x> ($ Id.VSub_DollarName '$nobs'))} {<Id.Lit_Equals '='>} {(DQ <x>)}) (C {<touch>} {(DQ (${ Id.VSub_Name QSLASH))} {(DQ (${ Id.VSub_Name ESLASH))} {(DQ (${ Id.VSub_Name SLASH))} ) ] ) (C {<sftp_ls>} {(DQ (${ Id.VSub_Name DIR) <'/fil*'>)} {(DQ <'file glob'>)} {(DQ (${ Id.VSub_Name DATA))} {(DQ )} ) (C {<sftp_ls>} {(DQ (${ Id.VSub_Name BASE) <'/d*'>)} {(DQ <'dir glob'>)} { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {(${ Id.VSub_Name DATA)}) ) ) } {(DQ )} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-wild'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'*'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ <'quoted glob'>)} {(DQ <'g-wild*'>)} {(DQ <g-wildx>)} ) (C {<sftp_ls>} {(DQ (${ Id.VSub_Name DIR) <'/g-wild'> <Id.Lit_BadBackslash '\\'> <'*'>)} {(DQ <'escaped glob'>)} {(DQ <'g-wild*'>)} {(DQ <g-wildx>)} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-quote'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ <'escaped quote'>)} {(DQ <g-quote> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>))} {(DQ )} ) (C {<sftp_ls>} { (DQ (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (${ Id.VSub_Name DIR) <'/g-quote'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ <'quoted quote'>)} {(DQ <g-quote> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>))} {(DQ )} ) (C {<sftp_ls>} { (DQ <'\''> (${ Id.VSub_Name DIR) <'/g-quote'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'\''> ) } {(DQ <'single-quoted quote'>)} {(DQ <g-quote> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>))} {(DQ )} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-q'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <' space'> ) } {(DQ <'escaped space'>)} {(DQ <'g-q space'>)} {(DQ )} ) (C {<sftp_ls>} {(DQ <'\''> (${ Id.VSub_Name DIR) <'/g-q space\''>)} {(DQ <'quoted space'>)} {(DQ <'g-q space'>)} {(DQ )} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-sl'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <ash> ) } {(DQ <'escaped slash'>)} {(DQ <g-sl> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <ash>)} {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<sftp_ls>} { (DQ <'\''> (${ Id.VSub_Name DIR) <'/g-sl'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <'ash\''> ) } {(DQ <'quoted slash'>)} {(DQ <g-sl> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <ash>)} {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-slash'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) ) } {(DQ <'escaped slash at EOL'>)} {(DQ <g-slash> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>))} {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<sftp_ls>} { (DQ <'\''> (${ Id.VSub_Name DIR) <'/g-slash'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <'\''> ) } {(DQ <'quoted slash at EOL'>)} {(DQ <g-slash> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>))} {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<sftp_ls>} { (DQ (${ Id.VSub_Name DIR) <'/g-qs'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ <'escaped slash+quote'>)} { (DQ <g-qs> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<sftp_ls>} { (DQ <'\''> (${ Id.VSub_Name DIR) <'/g-qs'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'\''> ) } {(DQ <'quoted slash+quote'>)} { (DQ <g-qs> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } {(DQ )} {(DQ ($ Id.VSub_DollarName '$nobs'))} ) (C {<rm>} {<-rf>} {(${ Id.VSub_Name BASE)}) ] )