diff --git a/examples/inner_expansions.ion b/examples/inner_expansions.ion new file mode 100644 index 0000000000000000000000000000000000000000..1526752905d63034833ee44d761d6cb2d302117f --- /dev/null +++ b/examples/inner_expansions.ion @@ -0,0 +1,6 @@ +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[1] @echo_array[2]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[2] @echo_array[1]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[2] @echo_array[0]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[0] @echo_array[2]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[1] @echo_array[0]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[0] @echo_array[1]) diff --git a/examples/inner_expansions.out b/examples/inner_expansions.out new file mode 100644 index 0000000000000000000000000000000000000000..7ec6163644e6efcd243ace89eb53bf5408f2acd9 --- /dev/null +++ b/examples/inner_expansions.out @@ -0,0 +1,6 @@ +me myself I +me I myself +myself I me +myself me I +I myself me +I me myself diff --git a/src/lib/parser/shell_expand/words/mod.rs b/src/lib/parser/shell_expand/words/mod.rs index 993a7cbdc284d1561dab58b98128067c5421f7b8..24d686ee968a8a46bd4d3d77adca5f4468cd3bea 100644 --- a/src/lib/parser/shell_expand/words/mod.rs +++ b/src/lib/parser/shell_expand/words/mod.rs @@ -254,6 +254,17 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE, b'$' if !self.flags.contains(Flags::SQUOTE) => { if self.data.as_bytes()[self.read + 1] == b'(' { + // Pop out the '(' char + iterator.next(); + self.read += 1; + level += 1; + } + } + b'@' if !self.flags.contains(Flags::SQUOTE) => { + if self.data.as_bytes()[self.read + 1] == b'(' { + // Pop out the '(' char + iterator.next(); + self.read += 1; level += 1; } } diff --git a/src/lib/parser/shell_expand/words/tests.rs b/src/lib/parser/shell_expand/words/tests.rs index f47e7aa5ff277048540abe2e917b4258aa72bcde..088e26b8b3680cae6cce810e0586d5c5cb676632 100644 --- a/src/lib/parser/shell_expand/words/tests.rs +++ b/src/lib/parser/shell_expand/words/tests.rs @@ -94,6 +94,22 @@ fn array_processes() { compare(input, expected); } +#[test] +fn array_process_within_string_process() { + compare( + "echo $(let free=[@(free -h)]; echo @free[6]@free[8]/@free[7])", + vec![ + WordToken::Normal("echo", false, false), + WordToken::Whitespace(" "), + WordToken::Process( + "let free=[@(free -h)]; echo @free[6]@free[8]/@free[7]", + false, + Select::All + ) + ] + ) +} + #[test] fn indexes() { let input = "@array[0..3] @array[0...3] @array[abc] @array[..3] @array[3..]";