(command.CommandList children: [ (C {<Id.KW_Set set>} {<-o>} {<nounset>}) (C {<Id.KW_Set set>} {<-o>} {<pipefail>}) (C {<Id.KW_Set set>} {<-o>} {<errexit>}) (C {<source>} {<test/common.sh>}) (C {<source>} {<benchmarks/common.sh>}) (C {<readonly>} {<Id.Lit_VarLike 'BASE_DIR='> <_tmp/osh-parser>}) (C {<readonly>} {<Id.Lit_VarLike 'SORTED='> ($ Id.VSub_DollarName '$BASE_DIR') </tmp/sorted.txt>}) (command.ShFunction name: write-sorted-manifest body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'files='> (braced_var_sub token: <Id.VSub_Number 1> suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {<benchmarks> <Id.Lit_Slash /> <osh-parser-files.txt>} ) ) } ) (C {<local>} {<Id.Lit_VarLike 'counts='> ($ Id.VSub_DollarName '$BASE_DIR') </tmp/line-counts.txt>} ) (C {<local>} {<Id.Lit_VarLike 'csv_out='> ($ Id.VSub_Number '$2')}) (command.Pipeline children: [ (C {<grep>} {<-v>} {(SQ <'^#'>)} {($ Id.VSub_DollarName '$files')}) (C {<xargs>} {<wc>} {<-l>}) (command.Simple words: [{<sort>} {<-n>}] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$counts')} ) ] ) ] negated: F ) (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$counts')}) (command.Simple words: [{<awk>} {(SQ <'$2 != "total" { print $2 }'>)}] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$SORTED')} ) ] ) ] negated: F ) (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$counts')}) (command.Simple words: [ {<awk>} { (SQ <'\n'> <' BEGIN { print "num_lines,path" }\n'> <' $2 != "total" { print $1 "," $2 }'> ) } ] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$csv_out')} ) ] ) ] negated: F ) ] ) ) (command.ShFunction name: parser-task body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'raw_dir='> ($ Id.VSub_Number '$1')}) (C {<local>} {<Id.Lit_VarLike 'job_id='> ($ Id.VSub_Number '$2')}) (C {<local>} {<Id.Lit_VarLike 'host='> ($ Id.VSub_Number '$3')}) (C {<local>} {<Id.Lit_VarLike 'host_hash='> ($ Id.VSub_Number '$4')}) (C {<local>} {<Id.Lit_VarLike 'sh_path='> ($ Id.VSub_Number '$5')}) (C {<local>} {<Id.Lit_VarLike 'shell_hash='> ($ Id.VSub_Number '$6')}) (C {<local>} {<Id.Lit_VarLike 'script_path='> ($ Id.VSub_Number '$7')}) (C {<echo>} { (DQ <'--- '> ($ Id.VSub_DollarName '$sh_path') <' '> ($ Id.VSub_DollarName '$script_path') <' ---'> ) } ) (C {<local>} {<Id.Lit_VarLike 'times_out='> (DQ ($ Id.VSub_DollarName '$raw_dir') </> ($ Id.VSub_DollarName '$host') <.> ($ Id.VSub_DollarName '$job_id') <.times.csv> ) } ) (C {<local>} {<Id.Lit_VarLike 'vm_out_dir='> (DQ ($ Id.VSub_DollarName '$raw_dir') </> ($ Id.VSub_DollarName '$host') <.> ($ Id.VSub_DollarName '$job_id') <.virtual-memory> ) } ) (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$vm_out_dir')}) (C {<local>} {<shell_name>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:shell_name) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [(C {<basename>} {($ Id.VSub_DollarName '$sh_path')})] ) ) } spids: [295] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:extra_args) op: assign_op.Equal rhs: {(SQ )} spids: [308] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<test>} {(DQ ($ Id.VSub_DollarName '$shell_name'))} {<Id.Lit_Equals '='>} {(SQ <osh>)} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<local>} {<script_name>}) (C {<local>} {<vm_out_path>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:script_name) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [(C {<basename>} {($ Id.VSub_DollarName '$script_path')})] ) ) } spids: [341] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:vm_out_path) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name vm_out_dir) </> (${ Id.VSub_Name shell_name) <-> (${ Id.VSub_Name shell_hash) <__> (${ Id.VSub_Name script_name) <.txt> ) } spids: [349] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:extra_args) op: assign_op.Equal rhs: { (DQ <'--ast-format none --parser-mem-dump '> ($ Id.VSub_DollarName '$vm_out_path') ) } spids: [370] ) ] ) ] spids: [313 328] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<benchmarks/time.py>} {<--output>} {($ Id.VSub_DollarName '$times_out')} {<--field>} {(DQ ($ Id.VSub_DollarName '$host'))} {<--field>} {(DQ ($ Id.VSub_DollarName '$host_hash'))} {<--field>} {(DQ ($ Id.VSub_DollarName '$shell_name'))} {<--field>} {(DQ ($ Id.VSub_DollarName '$shell_hash'))} {<--field>} {(DQ ($ Id.VSub_DollarName '$script_path'))} {<-->} {(DQ ($ Id.VSub_DollarName '$sh_path'))} {<-n>} {($ Id.VSub_DollarName '$extra_args')} {(DQ ($ Id.VSub_DollarName '$script_path'))} ) (C {<echo>} {<FAILED>}) ] ) ] ) ) (command.ShFunction name: print-tasks body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'provenance='> ($ Id.VSub_Number '$1')}) (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$provenance')}) (command.WhileUntil keyword: <Id.KW_While while> cond: [(command.Sentence child:(C {<read>} {<fields>}) terminator:<Id.Op_Semi _>)] body: (command.DoGroup children: [ (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$sorted')}) (C {<xargs>} {<-n>} {<1>} {<-->} {<echo>} {($ Id.VSub_DollarName '$fields')}) ] negated: F ) ] ) ) ] negated: F ) ] ) ) (C {<readonly>} {<Id.Lit_VarLike 'HEADER='> (SQ <'status,elapsed_secs,host_name,host_hash,shell_name,shell_hash,path'>) } ) (C {<readonly>} {<Id.Lit_VarLike 'NUM_COLUMNS='> <6>}) (command.ShFunction name: measure body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'provenance='> ($ Id.VSub_Number '$1')}) (C {<local>} {<Id.Lit_VarLike 'raw_dir='> (braced_var_sub token: <Id.VSub_Number 2> suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {($ Id.VSub_DollarName '$BASE_DIR') <Id.Lit_Slash /> <raw>} ) ) } ) (C {<local>} {<Id.Lit_VarLike 'name='> (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [(C {<basename>} {($ Id.VSub_DollarName '$provenance')})] ) ) } ) (C {<local>} {<Id.Lit_VarLike 'prefix='> (braced_var_sub token: <Id.VSub_Name name> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<.provenance.txt>}) ) } ) (C {<local>} {<Id.Lit_VarLike 'times_out='> (DQ ($ Id.VSub_DollarName '$raw_dir') </> ($ Id.VSub_DollarName '$prefix') <.times.csv>) } ) (C {<local>} {<Id.Lit_VarLike 'lines_out='> (DQ ($ Id.VSub_DollarName '$raw_dir') </> ($ Id.VSub_DollarName '$prefix') <.lines.csv>) } ) (C {<mkdir>} {<-p>} (word.BracedTree parts: [ ($ Id.VSub_DollarName '$BASE_DIR') </> (word_part.BracedTuple words:[{<tmp>} {<raw>} {<stage1>}]) ] ) {($ Id.VSub_DollarName '$raw_dir')} ) (C {<write-sorted-manifest>} {(SQ )} {($ Id.VSub_DollarName '$lines_out')}) (C {<local>} {<Id.Lit_VarLike 'sorted='> ($ Id.VSub_DollarName '$SORTED')}) (command.Simple words: [{<echo>} {($ Id.VSub_DollarName '$HEADER')}] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$times_out')} ) ] ) (C {<local>} {<Id.Lit_VarLike 'tasks='> ($ Id.VSub_DollarName '$BASE_DIR') </tasks.txt>}) (command.Simple words: [{<print-tasks>} {($ Id.VSub_DollarName '$provenance')}] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$tasks')} ) ] ) (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$tasks')}) (C {<xargs>} {<-n>} {($ Id.VSub_DollarName '$NUM_COLUMNS')} {<-->} {($ Id.VSub_Number '$0')} {<parser-task>} {($ Id.VSub_DollarName '$raw_dir')} ) ] negated: F ) (C {<cp>} {<-v>} {($ Id.VSub_DollarName '$provenance')} {($ Id.VSub_DollarName '$raw_dir')}) ] ) ) (command.ShFunction name: fake-other-host body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'dir='> (braced_var_sub token: <Id.VSub_Number 1> suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {<_tmp> <Id.Lit_Slash /> <osh-parser> <Id.Lit_Slash /> <raw>} ) ) } ) (command.ForEach iter_name: entry iter_words: [{($ Id.VSub_DollarName '$dir') </lisa> <Id.Lit_Star '*'>}] do_arg_iter: F body: (command.DoGroup children: [ (C {<local>} {<Id.Lit_VarLike 'fake='> (braced_var_sub token: <Id.VSub_Name entry> suffix_op: (suffix_op.PatSub pat: {<lisa>} replace: {<flanders>} replace_mode: Id.Undefined_Tok ) ) } ) (C {<mv>} {<-v>} {($ Id.VSub_DollarName '$entry')} {($ Id.VSub_DollarName '$fake')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<test>} {<-f>} {($ Id.VSub_DollarName '$fake')}) terminator: <Id.Op_Semi _> ) ] action: [ (C {<sed>} {<-i>} {(SQ <s/lisa/flanders/g>)} {($ Id.VSub_DollarName '$fake')}) ] spids: [807 816] ) ] ) ] ) ) ] ) ) (command.ShFunction name: stage1 body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'raw_dir='> (braced_var_sub token: <Id.VSub_Number 1> suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {($ Id.VSub_DollarName '$BASE_DIR') <Id.Lit_Slash /> <raw>} ) ) } ) (C {<local>} {<Id.Lit_VarLike 'out='> ($ Id.VSub_DollarName '$BASE_DIR') </stage1>}) (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$out')}) (C {<local>} {<Id.Lit_VarLike 'vm_csv='> ($ Id.VSub_DollarName '$out') </virtual-memory.csv>} ) (C {<local>} {<-a>} {<Id.Lit_VarLike 'x='> (sh_array_literal left: <Id.Op_LParen _> words: [ {($ Id.VSub_DollarName '$raw_dir') </flanders.> <Id.Lit_Star '*'> <.virtual-memory>} ] ) } ) (C {<local>} {<-a>} {<Id.Lit_VarLike 'y='> (sh_array_literal left: <Id.Op_LParen _> words: [ {($ Id.VSub_DollarName '$raw_dir') </lisa.> <Id.Lit_Star '*'> <.virtual-memory>} ] ) } ) (command.Simple words: [ {<benchmarks/virtual_memory.py>} {<osh-parser>} { (braced_var_sub token: <Id.VSub_Name x> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } { (braced_var_sub token: <Id.VSub_Name y> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$vm_csv')} ) ] ) (C {<local>} {<Id.Lit_VarLike 'times_csv='> ($ Id.VSub_DollarName '$out') </times.csv>}) (C {<local>} {<-a>} {<Id.Lit_VarLike 'a='> (sh_array_literal left: <Id.Op_LParen _> words: [ {($ Id.VSub_DollarName '$raw_dir') </flanders.> <Id.Lit_Star '*'> <.times.csv>} ] ) } ) (C {<local>} {<-a>} {<Id.Lit_VarLike 'b='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$raw_dir') </lisa.> <Id.Lit_Star '*'> <.times.csv>}] ) } ) (command.Simple words: [ {<csv-concat>} { (braced_var_sub token: <Id.VSub_Name a> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } { (braced_var_sub token: <Id.VSub_Name b> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$times_csv')} ) ] ) (C {<local>} {<Id.Lit_VarLike 'raw_data_csv='> ($ Id.VSub_DollarName '$out') </raw-data.csv>} ) (command.BraceGroup children: [ (C {<echo>} {(SQ <path>)}) (C {<echo>} { (braced_var_sub token: <Id.VSub_Name a> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ) (C {<echo>} { (braced_var_sub token: <Id.VSub_Name b> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ) ] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$raw_data_csv')} ) ] ) (C {<local>} {<Id.Lit_VarLike 'lines_csv='> ($ Id.VSub_DollarName '$out') </lines.csv>}) (C {<local>} {<-a>} {<Id.Lit_VarLike 'c='> (sh_array_literal left: <Id.Op_LParen _> words: [ {($ Id.VSub_DollarName '$raw_dir') </flanders.> <Id.Lit_Star '*'> <.lines.csv>} ] ) } ) (C {<local>} {<-a>} {<Id.Lit_VarLike 'd='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$raw_dir') </lisa.> <Id.Lit_Star '*'> <.lines.csv>}] ) } ) (C {<local>} {<Id.Lit_VarLike 'left='> (braced_var_sub token: <Id.VSub_Name c> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ) (C {<local>} {<Id.Lit_VarLike 'right='> (braced_var_sub token: <Id.VSub_Name d> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Unary op_id: Id.Node_UnaryMinus child: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (C {<diff>} {($ Id.VSub_DollarName '$left')} {($ Id.VSub_DollarName '$right')} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<die>} { (DQ <'Benchmarks were run on different files ('> ($ Id.VSub_DollarName '$left') <' != '> ($ Id.VSub_DollarName '$right') <')'> ) } ) ] spids: [1116 1127] ) ] ) (command.Simple words: [{<cat>} {($ Id.VSub_DollarName '$left')}] redirects: [ (redir.Redir op: <Id.Redir_Great '>'> fd: -1 arg_word: {($ Id.VSub_DollarName '$lines_csv')} ) ] ) (C {<head>} {($ Id.VSub_DollarName '$out') </> <Id.Lit_Star '*'>}) (C {<wc>} {<-l>} {($ Id.VSub_DollarName '$out') </> <Id.Lit_Star '*'>}) ] ) ) (command.ShFunction name: print-report body: (command.BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'in_dir='> ($ Id.VSub_Number '$1')}) (C {<local>} {<Id.Lit_VarLike 'base_url='> (SQ <../../web>)}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1290 stdin_parts: [ <'<!DOCTYPE html>\n'> <'<html>\n'> <' <head>\n'> <' <title>OSH Parser Performance</title>\n'> <' <script type='> <Id.Right_DoubleQuote '"'> <text/javascript> <Id.Right_DoubleQuote '"'> <' src='> <Id.Right_DoubleQuote '"'> ($ Id.VSub_DollarName '$base_url') </table/table-sort.js> <Id.Right_DoubleQuote '"'> <'></script>\n'> <' <link rel='> <Id.Right_DoubleQuote '"'> <stylesheet> <Id.Right_DoubleQuote '"'> <' type='> <Id.Right_DoubleQuote '"'> <text/css> <Id.Right_DoubleQuote '"'> <' href='> <Id.Right_DoubleQuote '"'> ($ Id.VSub_DollarName '$base_url') </table/table-sort.css> <Id.Right_DoubleQuote '"'> <' />\n'> <' <link rel='> <Id.Right_DoubleQuote '"'> <stylesheet> <Id.Right_DoubleQuote '"'> <' type='> <Id.Right_DoubleQuote '"'> <text/css> <Id.Right_DoubleQuote '"'> <' href='> <Id.Right_DoubleQuote '"'> ($ Id.VSub_DollarName '$base_url') </benchmarks.css> <Id.Right_DoubleQuote '"'> <' />\n'> <'\n'> <' </head>\n'> <' <body>\n'> <' <p id='> <Id.Right_DoubleQuote '"'> <home-link> <Id.Right_DoubleQuote '"'> <'>\n'> <' <a href='> <Id.Right_DoubleQuote '"'> </> <Id.Right_DoubleQuote '"'> <'>oilshell.org</a>\n'> <' </p>\n'> <' <h2>OSH Parser Performance</h2>\n'> <'\n'> <' <p>We run <code>'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <'sh -n '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <'file</code> for various files under various\n'> <' shells. This means that shell startup time is included in the\n'> <' elapsed time measurements, but long files are chosen to minimize its\n'> <' effect.</p>\n'> <'\n'> <' <h3>Parse Time Summary</h3>\n'> ] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </summary.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1309 stdin_parts: [ <' <h3>Memory Used to Parse</h3>\n'> <'\n'> <' <p>Running under <code>osh-ovm</code>. Memory usage is measured in MB\n'> <' (powers of 10), not MiB (powers of 2).</p>\n'> ] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </virtual-memory.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1326 stdin_parts: [<'\n'> <' <h3>Shell and Host Details</h3>\n'>] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </shells.csv>}) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </hosts.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1347 stdin_parts: [<' <h3>Raw Data</h3>\n'>] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </raw-data.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1364 stdin_parts: [ <' <h3>Parse Time Breakdown by File</h3>\n'> <'\n'> <' <h4>Elasped Time in milliseconds</h4>\n'> ] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </elapsed.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1380 stdin_parts: [<'\n'> <' <h4>Parsing Rate in lines/millisecond</h4>\n'>] ) ] ) (C {<csv2html>} {($ Id.VSub_DollarName '$in_dir') </rate.csv>}) (command.Simple words: [{<cat>}] redirects: [ (redir.HereDoc op: <Id.Redir_DLess '<<'> fd: -1 here_begin: {<EOF>} here_end_span_id: 1396 stdin_parts: [<' </body>\n'> <'</html>\n'>] ) ] ) ] ) ) (command.ShFunction name: time-test body: (command.BraceGroup children: [ (C {<benchmarks/time.py>} {<--field>} {<bash>} {<--field>} {<foo.txt>} {<--output>} {<_tmp/bench.csv>} {<sleep>} {<0.123>} ) (C {<cat>} {<_tmp/bench.csv>}) ] ) ) (C {(DQ ($ Id.VSub_At '$@'))}) ] )