(command.CommandList children: [ (command.Simple blame_tok: <.> more_env: [] words: [{<.>} {<'../string.lib.sh'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <.> more_env: [] words: [{<.>} {<'../bool.lib.sh'>}] redirects: [] do_fork: T ) (command.ShFunction name_tok: <test_k_string_contains> name: test_k_string_contains body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'241345 contains 1'>)} {(DQ <'k_string_contains 1 241345'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'d3dabcd contains a'>)} {(DQ <'k_string_contains a d3dabcd'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'-- contains -'>)} {(DQ <'k_string_contains - --'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'acd does not contain b'>)} {(DQ <'k_string_contains b acd'>)} ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_get_line> name: test_k_string_get_line body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <local> more_env: [] words: [{<local>} {<Id.Lit_VarLike 'line1='> (DQ <'Hello world!'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <local> more_env: [] words: [{<local>} {<Id.Lit_VarLike 'line2='> (DQ <'This is some text'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <local> more_env: [] words: [{<local>} {<Id.Lit_VarLike 'line3='> (DQ <'And this is more'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <local> more_env: [] words: [ {<local>} {<Id.Lit_VarLike 'str='> (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} { (DQ <'%s'> <Id.Lit_BadBackslash '\\'> <'n%s'> <Id.Lit_BadBackslash '\\'> <'n%s'> ) } {(DQ (${ Id.VSub_Name line1))} {(DQ (${ Id.VSub_Name line2))} {(DQ (${ Id.VSub_Name line3))} ] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ (${ Id.VSub_Name line1))} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_get_line> more_env: [] words: [{<k_string_get_line>} {<1>} {(DQ (${ Id.VSub_Name str))}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ (${ Id.VSub_Name line2))} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_get_line> more_env: [] words: [{<k_string_get_line>} {<2>} {(DQ (${ Id.VSub_Name str))}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ (${ Id.VSub_Name line3))} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_get_line> more_env: [] words: [{<k_string_get_line>} {<3>} {(DQ (${ Id.VSub_Name str))}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_ends_with> name: test_k_string_ends_with body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'12345 ends with 5'>)} {(DQ <'k_string_ends_with 5 12345'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'12345 does not end with 6'>)} {(DQ <'k_string_ends_with 6 12345'>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'abcd ends with d'>)} {(DQ <'k_string_ends_with d abcd'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'-- ends with -'>)} {(DQ <'k_string_ends_with - --'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'- does not end with --'>)} {(DQ <'k_string_ends_with -- -'>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'abcd does not end with b'>)} {(DQ <'k_string_ends_with b abcd'>)} ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_starts_with> name: test_k_string_starts_with body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertTrue> more_env: [] words: [ {<assertTrue>} {(DQ <'12345 starts with 1'>)} {(DQ <'k_string_starts_with 1 12345'>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'abcd starts with a'>)} {(DQ <'k_string_starts_with a abcd'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertTrue> more_env: [] words: [{<assertTrue>} {(DQ <'-- starts with -'>)} {(DQ <'k_string_starts_with - --'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'- does not start with --'>)} {(DQ <'k_string_starts_with -- -'>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertFalse> more_env: [] words: [ {<assertFalse>} {(DQ <'abcd does not start with b'>)} {(DQ <'k_string_starts_with b abcd'>)} ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_lower> name: test_k_string_lower body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'ABC to lower'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_lower> more_env: [] words: [{<k_string_lower>} {<ABC>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'Abc to lower'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_lower> more_env: [] words: [{<k_string_lower>} {<Abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'123 to lower'>)} {<123>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_lower> more_env: [] words: [{<k_string_lower>} {<123>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'D-e+F to lower'>)} {<d-e> <Id.Lit_Other '+'> <f>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_lower> more_env: [] words: [{<k_string_lower>} {<D-e> <Id.Lit_Other '+'> <F>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_upper> name: test_k_string_upper body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc to upper'>)} {<ABC>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_upper> more_env: [] words: [{<k_string_upper>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'Abc to upper'>)} {<ABC>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_upper> more_env: [] words: [{<k_string_upper>} {<Abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'123 to upper'>)} {<123>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_upper> more_env: [] words: [{<k_string_upper>} {<123>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'D-e+F to upper'>)} {<D-E> <Id.Lit_Other '+'> <F>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_upper> more_env: [] words: [{<k_string_upper>} {<D-e> <Id.Lit_Other '+'> <F>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_pad_right> name: test_k_string_pad_right body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'Pad to 8 spaces'>)} {(DQ <'foo '>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_pad_right> more_env: [] words: [{<k_string_pad_right>} {<8>} {<foo>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_pad_left> name: test_k_string_pad_left body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'Pad to 8 spaces'>)} {(DQ <' foo'>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_pad_left> more_env: [] words: [{<k_string_pad_left>} {<8>} {<foo>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_remove_start> name: test_k_string_remove_start body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove a from start'>)} {<bc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_start> more_env: [] words: [{<k_string_remove_start>} {<a>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'aabc remove a from start'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_start> more_env: [] words: [{<k_string_remove_start>} {<a>} {<aabc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove b from start'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_start> more_env: [] words: [{<k_string_remove_start>} {<b>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove c from start'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_start> more_env: [] words: [{<k_string_remove_start>} {<c>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove d from start'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_start> more_env: [] words: [{<k_string_remove_start>} {<d>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_remove_end> name: test_k_string_remove_end body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove a from end'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_end> more_env: [] words: [{<k_string_remove_end>} {<a>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove b from end'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_end> more_env: [] words: [{<k_string_remove_end>} {<b>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove c from end'>)} {<ab>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_end> more_env: [] words: [{<k_string_remove_end>} {<c>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'abc remove d from end'>)} {<abc>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_remove_end> more_env: [] words: [{<k_string_remove_end>} {<d>} {<abc>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_join> name: test_k_string_join body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'a joined by hyphen'>)} {(DQ <a>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_join> more_env: [] words: [{<k_string_join>} {(DQ <->)} {<a>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'a, b joined by hyphen'>)} {(DQ <a-b>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_join> more_env: [] words: [{<k_string_join>} {(DQ <->)} {<a>} {<b>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'a, b, c joined by hyphen'>)} {(DQ <a-b-c>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_join> more_env: [] words: [{<k_string_join>} {(DQ <->)} {<a>} {<b>} {<c>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'a, b, c joined by nothing'>)} {(DQ <abc>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_join> more_env: [] words: [{<k_string_join>} {(DQ )} {<a>} {<b>} {<c>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <test_k_string_trim> name: test_k_string_trim body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'\' a\' trimmed'>)} {(DQ <a>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_trim> more_env: [] words: [{<k_string_trim>} {(DQ <' a'>)}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'\'a\t\' trimmed'>)} {(DQ <a>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_trim> more_env: [] words: [{<k_string_trim>} {(DQ <'a\t'>)}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'\' a \' trimmed'>)} {(DQ <a>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_trim> more_env: [] words: [{<k_string_trim>} {(DQ <' a '>)}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <assertEquals> more_env: [] words: [ {<assertEquals>} {(DQ <'\' a b c\t\' trimmed'>)} {(DQ <'a b c'>)} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <k_string_trim> more_env: [] words: [{<k_string_trim>} {(DQ <' a b c\t'>)}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) ] )