From f03f4e0fcf62c9b3267bc5d8b62068d89ec593cd Mon Sep 17 00:00:00 2001 From: Rory Dudley Date: Sun, 31 Mar 2024 00:14:46 -0600 Subject: Don't interpret environment variables in single quoted strings Previously, if an environment variable was given in a string, such as: '$PATH' or "$PATH", both would be replaced with the value of $PATH from the environment. However, for single quotes strings, any values inside should be taken at face value. In other words, echo '$PATH' should simply write out: $PATH, and not whatever environment value $PATH happens to be. This patch replaced '$' in single quoted strings with the ASCII shift out (x0e) character. Any ASCII SO placeholder is replaced with a '$' in recite(), after the environment variables have been accounted for. --- src/poem/read/parse.rs | 4 ++++ src/poem/recite.rs | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/poem/read/parse.rs b/src/poem/read/parse.rs index c1dec44..0836eea 100644 --- a/src/poem/read/parse.rs +++ b/src/poem/read/parse.rs @@ -31,6 +31,10 @@ macro_rules! string { match $chars.next() { None => return Err(Mishap::PartialMishap($j, $i, $c)), Some(c) if c == token => break, + Some(c) if token == '\'' && c == '$' => { + $word.push('\x0e'); + $i += 1; + } Some(c) => { $word.push(c); $i += 1; diff --git a/src/poem/recite.rs b/src/poem/recite.rs index d95af92..45d4d2e 100644 --- a/src/poem/recite.rs +++ b/src/poem/recite.rs @@ -52,6 +52,11 @@ impl Reciteable for Poem { }; *word = word.replace(name.as_str(), envar.as_str()); } + + // For any words in single quotes strings that began with a '$', + // need to replace the ASCII SO placeholder with the '$' char once + // more + *word = word.replace('\x0e', "$"); } // Check for aliases -- cgit v1.2.3