(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:progname) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<basename>} {($ Id.VSub_Number '$0')}) ) ) } spids: [56] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:usage) op: assign_op.Equal rhs: {(DQ <'usage: '> (${ Id.VSub_Name progname) <' [--ssh SSH] HOST COMMAND ...'>)} spids: [66] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:help) op: assign_op.Equal rhs: { (DQ <'Run a glibc test COMMAND on the remote machine HOST, via ssh,\n'> <'preserving the current working directory, and respecting quoting.\n'> <'\n'> <'If the \'--ssh SSH\' flag is present, use SSH as the SSH command,\n'> <'instead of ordinary \'ssh\'.\n'> <'\n'> <'If the \'--timeoutfactor FACTOR\' flag is present, set TIMEOUTFACTOR on\n'> <'the remote machine to the specified FACTOR.\n'> <'\n'> <'To use this to run glibc tests, invoke the tests as follows:\n'> <'\n'> <' '> <Id.Lit_Dollar '$'> <' make test-wrapper=\'ABSPATH/cross-test-ssh.sh HOST\' tests\n'> <'\n'> <'where ABSPATH is the absolute path to this script, and HOST is the\n'> <'name of the machine to connect to via ssh.\n'> <'\n'> <'If you need to connect to the test machine as a different user, you\n'> <'may specify that just as you would to SSH:\n'> <'\n'> <' '> <Id.Lit_Dollar '$'> <' make test-wrapper=\'ABSPATH/cross-test-ssh.sh USER@HOST\' tests\n'> <'\n'> <'Naturally, the remote user must have an appropriate public key, and\n'> <'you will want to ensure that SSH does not prompt interactively for a\n'> <'password on each connection.\n'> <'\n'> <'HOST and the build machines (on which \'make check\' is being run) must\n'> <'share a filesystem; all files needed by the tests must be visible at\n'> <'the same paths on both machines.\n'> <'\n'> (${ Id.VSub_Name progname) <' runs COMMAND in the same directory on the HOST that\n'> (${ Id.VSub_Name progname) <' itself is run in on the build machine.\n'> <'\n'> <'The command and arguments are passed to the remote host in a way that\n'> <'avoids any further shell substitution or expansion, on the assumption\n'> <'that the shell on the build machine has already done them\n'> <appropriately.> ) } spids: [75] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ssh) op: assign_op.Equal rhs: {(SQ <ssh>)} spids: [126] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:timeoutfactor) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$TIMEOUTFACTOR')} spids: [131] ) ] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<0>} {<Id.Lit_RBracket ']'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Case to_match: {(DQ ($ Id.VSub_Number '$1'))} arms: [ (case_arm pat_list: [{(DQ <--ssh>)}] action: [ (C {<shift>}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-lt>} {<1>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(command.ControlFlow token:<Id.ControlFlow_Break break>)] spids: [169 182] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ssh) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [191] ) ] ) ] spids: [160 163 197 -1] ) (case_arm pat_list: [{(DQ <--timeoutfactor>)}] action: [ (C {<shift>}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-lt>} {<1>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(command.ControlFlow token:<Id.ControlFlow_Break break>)] spids: [210 223] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:timeoutfactor) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [232] ) ] ) ] spids: [201 204 238 -1] ) (case_arm pat_list: [{(DQ <--help>)}] action: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$usage'))}) (C {<echo>} {(DQ ($ Id.VSub_DollarName '$help'))}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<0>} ) ] spids: [242 245 267 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [(command.ControlFlow token:<Id.ControlFlow_Break break>)] spids: [271 272 278 -1] ) ] ) (C {<shift>}) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-lt>} {<1>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.Simple words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$usage'))}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) (command.Simple words: [ {<echo>} {(DQ <'Type \''> (${ Id.VSub_Name progname) <' --help\' for more detailed help.'>)} ] 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: [289 302] ) ] ) (command.CommandList children: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:host) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [336] ) ] ) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] ) (command.ShFunction name: bourne_quote body: (BraceGroup children: [ (C {<local>} {<arg>} {<qarg>}) (command.ForEach iter_name: arg iter_words: [{(DQ ($ Id.VSub_At '$@'))}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:qarg) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name arg> suffix_op: (suffix_op.PatSub pat: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>)} replace: {(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 '\\\''> ) } replace_mode: Id.Lit_Slash ) ) } spids: [380] ) ] ) (C {<echo>} {<-n>} {(DQ <'\''> ($ Id.VSub_DollarName '$qarg') <'\' '>)}) ] ) ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:command) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<bourne_quote>} {(DQ ($ Id.VSub_At '$@'))}) ) ) } spids: [416] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:command) op: assign_op.Equal rhs: { (DQ <'cd '> (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<bourne_quote>} {(DQ ($ Id.VSub_DollarName '$PWD'))}) ) <'\n'> (${ Id.VSub_Name command) ) } spids: [431] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$timeoutfactor'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:command) op: assign_op.Equal rhs: { (DQ <'export TIMEOUTFACTOR='> (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<bourne_quote>} {(DQ ($ Id.VSub_DollarName '$timeoutfactor'))}) ) <'\n'> (${ Id.VSub_Name command) ) } spids: [465] ) ] ) ] spids: [451 462] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:full_command) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<bourne_quote>} {(DQ (${ Id.VSub_Name command))}) ) ) } spids: [496] ) ] ) (C {($ Id.VSub_DollarName '$ssh')} {(DQ ($ Id.VSub_DollarName '$host'))} {<'/bin/sh'>} {<-c>} {(DQ ($ Id.VSub_DollarName '$full_command'))} ) ] )