(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 '$@'))}) ] )