diff --git a/crates/nu-cli/src/repl.rs b/crates/nu-cli/src/repl.rs index 965066d2e4..1fe5109cfc 100644 --- a/crates/nu-cli/src/repl.rs +++ b/crates/nu-cli/src/repl.rs @@ -63,8 +63,6 @@ pub fn evaluate_repl( let config = engine_state.get_config(); let use_color = config.use_ansi_coloring.get(engine_state); - confirm_stdin_is_terminal()?; - let mut entry_num = 0; // Let's grab the shell_integration configs @@ -104,6 +102,8 @@ pub fn evaluate_repl( engine_state.merge_env(&mut unique_stack)?; } + confirm_stdin_is_terminal()?; + let hostname = System::host_name(); if shell_integration_osc2 { run_shell_integration_osc2(None, engine_state, &mut unique_stack, use_color); diff --git a/src/main.rs b/src/main.rs index 8f228b5f1f..32a602707e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -323,36 +323,6 @@ fn main() -> Result<()> { "NU_VERSION".to_string(), Value::string(env!("CARGO_PKG_VERSION"), Span::unknown()), ); - // Add SHLVL if interactive - if engine_state.is_interactive { - engine_state.add_env_var("PROMPT_INDICATOR".to_string(), Value::test_string("> ")); - engine_state.add_env_var( - "PROMPT_INDICATOR_VI_NORMAL".to_string(), - Value::test_string("> "), - ); - engine_state.add_env_var( - "PROMPT_INDICATOR_VI_INSERT".to_string(), - Value::test_string(": "), - ); - engine_state.add_env_var( - "PROMPT_MULTILINE_INDICATOR".to_string(), - Value::test_string("::: "), - ); - engine_state.add_env_var( - "TRANSIENT_PROMPT_MULTILINE_INDICATOR".to_string(), - Value::test_string(""), - ); - engine_state.add_env_var( - "TRANSIENT_PROMPT_COMMAND_RIGHT".to_string(), - Value::test_string(""), - ); - let mut shlvl = engine_state - .get_env_var("SHLVL") - .map(|x| x.as_str().unwrap_or("0").parse::().unwrap_or(0)) - .unwrap_or(0); - shlvl += 1; - engine_state.add_env_var("SHLVL".to_string(), Value::int(shlvl, Span::unknown())); - } if parsed_nu_cli_args.no_std_lib.is_none() { load_standard_library(&mut engine_state)?; @@ -510,6 +480,35 @@ fn main() -> Result<()> { input, ); } else { + // Environment variables that apply only when in REPL + engine_state.add_env_var("PROMPT_INDICATOR".to_string(), Value::test_string("> ")); + engine_state.add_env_var( + "PROMPT_INDICATOR_VI_NORMAL".to_string(), + Value::test_string("> "), + ); + engine_state.add_env_var( + "PROMPT_INDICATOR_VI_INSERT".to_string(), + Value::test_string(": "), + ); + engine_state.add_env_var( + "PROMPT_MULTILINE_INDICATOR".to_string(), + Value::test_string("::: "), + ); + engine_state.add_env_var( + "TRANSIENT_PROMPT_MULTILINE_INDICATOR".to_string(), + Value::test_string(""), + ); + engine_state.add_env_var( + "TRANSIENT_PROMPT_COMMAND_RIGHT".to_string(), + Value::test_string(""), + ); + let mut shlvl = engine_state + .get_env_var("SHLVL") + .map(|x| x.as_str().unwrap_or("0").parse::().unwrap_or(0)) + .unwrap_or(0); + shlvl += 1; + engine_state.add_env_var("SHLVL".to_string(), Value::int(shlvl, Span::unknown())); + run_repl(&mut engine_state, parsed_nu_cli_args, entire_start_time)? } diff --git a/tests/shell/environment/env.rs b/tests/shell/environment/env.rs index 98f1e1ded8..ab97eb6872 100644 --- a/tests/shell/environment/env.rs +++ b/tests/shell/environment/env.rs @@ -231,17 +231,36 @@ fn std_log_env_vars_have_defaults() { } #[test] -fn env_shlvl() { +fn env_shlvl_commandstring_does_not_increment() { let actual = nu!(" $env.SHLVL = 5 - nu -i -c 'print $env.SHLVL' + nu -c 'print $env.SHLVL; exit' + "); + + assert_eq!(actual.out, "5"); +} + +// Note: Do not use -i / --interactive in tests. +// -i attempts to acquire a terminal, and if more than one +// test tries to obtain a terminal at the same time, the +// test run will likely hang, at least for some users. +// Instead, use -e / --execute with an `exit` to test REPL +// functionality as demonstrated below. +#[test] +fn env_shlvl_in_repl() { + let actual = nu!(" + $env.SHLVL = 5 + nu --no-std-lib -n -e 'print $env.SHLVL; exit' "); assert_eq!(actual.out, "6"); +} +#[test] +fn env_shlvl_in_exec_repl() { let actual = nu!(" $env.SHLVL = 29 - nu -i -c \"exec nu -i -c 'print $env.SHLVL'\" + nu -c \"exec nu --no-std-lib -n -e 'print $env.SHLVL; exit'\" "); assert_eq!(actual.out, "30");