Improved logic surrounding expansion of assignments

This commit is contained in:
2025-03-07 19:12:28 -05:00
parent fb0a3af428
commit 972e2ceefa
12 changed files with 154 additions and 92 deletions

View File

@@ -1,6 +1,6 @@
use std::os::fd::AsRawFd;
use crate::prelude::*;
use crate::{expand::vars::expand_string, prelude::*};
use shellenv::jobs::{ChildProc, JobBldr};
pub mod shellcmd;
@@ -274,22 +274,30 @@ fn exec_assignment(node: Node, shenv: &mut ShEnv) -> ShResult<()> {
log!(TRACE, "Command: {:?}", cmd);
let mut assigns = assignments.into_iter();
if let Some(cmd) = cmd {
while let Some(assign) = assigns.next() {
let assign_raw = assign.as_raw(shenv);
if let Some((var,val)) = assign_raw.split_once('=') {
shenv.vars_mut().export(var, val);
while let Some((var,val)) = assigns.next() {
let var_raw = var.as_raw(shenv);
let val_raw = val.as_raw(shenv);
if check_expansion(&val_raw).is_some() {
let exp = expand_token(val.clone(), shenv)?;
let val_exp = exp.into_iter().next().unwrap_or(val);
let val_exp_raw = val_exp.as_raw(shenv);
shenv.vars_mut().export(&var_raw, &val_exp_raw);
} else {
shenv.vars_mut().export(&var_raw, &val_raw);
}
}
if cmd.flags().contains(NdFlag::BUILTIN) {
exec_builtin(*cmd, shenv)?;
} else {
exec_cmd(*cmd, shenv)?;
}
dispatch_command(*cmd, shenv)?;
} else {
while let Some(assign) = assigns.next() {
let assign_raw = assign.as_raw(shenv);
if let Some((var,val)) = assign_raw.split_once('=') {
shenv.vars_mut().set_var(var, val);
while let Some((var,val)) = assigns.next() {
let var_raw = var.as_raw(shenv);
let val_raw = val.as_raw(shenv);
if check_expansion(&val_raw).is_some() {
let exp = expand_token(val.clone(), shenv)?;
let val_exp = exp.into_iter().next().unwrap_or(val);
let val_exp_raw = val_exp.as_raw(shenv);
shenv.vars_mut().export(&var_raw, &val_exp_raw);
} else {
shenv.vars_mut().export(&var_raw, &val_raw);
}
}
}