diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index 2260f17fa..97bfd6b5e 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -1,7 +1,10 @@ use crate::{current_dir_str, get_full_help}; use nu_path::expand_path_with; use nu_protocol::{ - ast::{Assignment, Bits, Block, Boolean, Call, Comparison, Expr, Expression, Math, Operator}, + ast::{ + Assignment, Bits, Block, Boolean, Call, Comparison, Expr, Expression, Math, Operator, + PathMember, + }, engine::{EngineState, Stack, Visibility}, Config, HistoryFileFormat, IntoInterruptiblePipelineData, IntoPipelineData, ListStream, PipelineData, Range, RawStream, ShellError, Span, Spanned, SyntaxShape, Unit, Value, VarId, @@ -446,15 +449,30 @@ pub fn eval_expression( } Expr::FullCellPath(cell_path) => match &cell_path.head.expr { Expr::Var(var_id) | Expr::VarDecl(var_id) => { - let var_info = engine_state.get_var(*var_id); - if var_info.mutable { - let mut lhs = - eval_expression(engine_state, stack, &cell_path.head)?; - lhs.update_data_at_cell_path(&cell_path.tail, rhs)?; - stack.vars.insert(*var_id, lhs); + if var_id == &ENV_VARIABLE_ID { + // let mut lhs = + // eval_expression(engine_state, stack, &cell_path.head)?; + //lhs.update_data_at_cell_path(&cell_path.tail, rhs)?; + match &cell_path.tail[0] { + PathMember::String { val, .. } => { + stack.add_env_var(val.to_string(), rhs); + } + PathMember::Int { val, .. } => { + stack.add_env_var(val.to_string(), rhs); + } + } Ok(Value::nothing(cell_path.head.span)) } else { - Err(ShellError::AssignmentRequiresMutableVar(lhs.span)) + let var_info = engine_state.get_var(*var_id); + if var_info.mutable { + let mut lhs = + eval_expression(engine_state, stack, &cell_path.head)?; + lhs.update_data_at_cell_path(&cell_path.tail, rhs)?; + stack.vars.insert(*var_id, lhs); + Ok(Value::nothing(cell_path.head.span)) + } else { + Err(ShellError::AssignmentRequiresMutableVar(lhs.span)) + } } } _ => Err(ShellError::AssignmentRequiresVar(lhs.span)), diff --git a/tests/shell/environment/env.rs b/tests/shell/environment/env.rs index 8158c93db..50f5673dd 100644 --- a/tests/shell/environment/env.rs +++ b/tests/shell/environment/env.rs @@ -77,6 +77,14 @@ fn env_shorthand_multi() { assert_eq!(actual.out, "barbaz"); } +#[test] +fn env_assignment() { + let actual = nu!(cwd: ".", r#" + $env.FOOBAR = "barbaz"; $env.FOOBAR + "#); + assert_eq!(actual.out, "barbaz"); +} + #[test] fn let_env_file_pwd_env_var_fails() { let actual = nu!(cwd: ".", r#"let-env FILE_PWD = 'foo'"#);