diff --git a/crates/rattler_shell/src/shell/mod.rs b/crates/rattler_shell/src/shell/mod.rs index 32632fa7e0..c1ec86a75f 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_else(|_| value.into()); + 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}"