Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions crates/rattler_shell/src/shell/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down
Loading