From f7c597004f77fd29386c0fd59ee143a742433f70 Mon Sep 17 00:00:00 2001 From: fecet Date: Wed, 23 Jul 2025 16:42:41 +0800 Subject: [PATCH 1/2] fix: allow variable expansion --- crates/rattler_shell/src/shell/mod.rs | 14 ++++++++++++-- .../rattler_shell__shell__tests__bash.snap | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/crates/rattler_shell/src/shell/mod.rs b/crates/rattler_shell/src/shell/mod.rs index 32632fa7e0..f86953ee82 100644 --- a/crates/rattler_shell/src/shell/mod.rs +++ b/crates/rattler_shell/src/shell/mod.rs @@ -273,8 +273,18 @@ pub struct Bash; impl Shell for Bash { fn set_env_var(&self, f: &mut impl Write, env_var: &str, value: &str) -> ShellResult { validate_env_var_name(env_var)?; - let quoted_value = shlex::try_quote(value).unwrap_or_default(); - Ok(writeln!(f, "export {env_var}={quoted_value}")?) + + // Check if the value contains variable references ($) + // If so, use double quotes to allow variable expansion, otherwise use shlex quoting + if value.contains('$') { + // Use double quotes to allow variable expansion, but escape any existing double quotes + let escaped_value = value.replace('"', "\\\""); + Ok(writeln!(f, "export {env_var}=\"{escaped_value}\"")?) + } else { + // Use shlex quoting for values that don't need variable expansion + let quoted_value = shlex::try_quote(value).unwrap_or_default(); + Ok(writeln!(f, "export {env_var}={quoted_value}")?) + } } fn unset_env_var(&self, f: &mut impl Write, env_var: &str) -> ShellResult { diff --git a/crates/rattler_shell/src/shell/snapshots/rattler_shell__shell__tests__bash.snap b/crates/rattler_shell/src/shell/snapshots/rattler_shell__shell__tests__bash.snap index 2d68ab4e35..09d9a46599 100644 --- a/crates/rattler_shell/src/shell/snapshots/rattler_shell__shell__tests__bash.snap +++ b/crates/rattler_shell/src/shell/snapshots/rattler_shell__shell__tests__bash.snap @@ -5,7 +5,7 @@ expression: script.to_string() export FOO=bar export FOO2='a b' export FOO3="a\\b" -export FOO4='${UNEXPANDED_VAR}' +export FOO4="${UNEXPANDED_VAR}" unset FOO export PATH="${PATH}:bar:a/b" export PATH="bar:a/b:${PATH}" From 9c54be2d4b4a19caac4c21ecfd8da3bd792bcf5e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 24 Jul 2025 17:14:10 +0200 Subject: [PATCH 2/2] Better default value for `try_quote` --- crates/rattler_shell/src/shell/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rattler_shell/src/shell/mod.rs b/crates/rattler_shell/src/shell/mod.rs index f86953ee82..c1ec86a75f 100644 --- a/crates/rattler_shell/src/shell/mod.rs +++ b/crates/rattler_shell/src/shell/mod.rs @@ -282,7 +282,7 @@ impl Shell for Bash { Ok(writeln!(f, "export {env_var}=\"{escaped_value}\"")?) } else { // Use shlex quoting for values that don't need variable expansion - let quoted_value = shlex::try_quote(value).unwrap_or_default(); + let quoted_value = shlex::try_quote(value).unwrap_or_else(|_| value.into()); Ok(writeln!(f, "export {env_var}={quoted_value}")?) } }