(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:NEEDED_PROGRAMS) op: Equal rhs: {(ArrayLiteralPart words:[{(curl)}{(git)}{(rsync)}{(ssh)}])} spids: [3] ) ] spids: [3] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:FAILED) op:Equal rhs:{(0)} spids:[16])] spids: [16] ) (ForEach iter_name: binary iter_words: [ { (BracedVarSub token: <VSub_Name NEEDED_PROGRAMS> bracket_op: (WholeArray op_id:Lit_At) spids: [25 30] ) } ] do_arg_iter: False body: (DoGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [ (SimpleCommand words: [{(which)} {($ VSub_Name "$binary")}] redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {(/dev/null)} spids: [44] ) ] ) ] negated: True ) terminator: <Op_Semi ";"> ) ] action: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:FAILED) op:Equal rhs:{(1)} spids:[51])] spids: [51] ) (SimpleCommand words: [ {(echo)} {(DQ ("Unable to locate ") ($ VSub_Name "$binary") (" on the path."))} ] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[63])] ) ] spids: [-1 48] ) ] spids: [-1 67] ) ] spids: [33 69] ) spids: [24 31] ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobNEqual left: {($ VSub_Name "$FAILED")} right: {(0)} ) ) terminator: <Op_Semi ";"> ) ] action: [ (SimpleCommand words: [ {(echo)} { (DQ ( "Please see above error output to determine which programs you need to install or make available on your path. Aborting." ) ) } ] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[94])] ) (C {(exit)} {(1)}) ] spids: [-1 85] ) ] spids: [-1 102] ) ] )