diff --git a/crates/nu-command/tests/commands/complete.rs b/crates/nu-command/tests/commands/complete.rs index cc398d4c8c..a5a8b6a256 100644 --- a/crates/nu-command/tests/commands/complete.rs +++ b/crates/nu-command/tests/commands/complete.rs @@ -92,3 +92,16 @@ fn capture_error_with_both_stdout_stderr_messages_not_hang_nushell() { }, ) } + +#[test] +fn combined_pipe_redirection() { + let actual = nu!("$env.FOO = hello; $env.BAR = world; nu --testbin echo_env_mixed out-err FOO BAR o+e>| complete | get stdout"); + assert_eq!(actual.out, "helloworld"); +} + +#[test] +fn err_pipe_redirection() { + let actual = + nu!("$env.FOO = hello; nu --testbin echo_env_stderr FOO e>| complete | get stdout"); + assert_eq!(actual.out, "hello"); +} diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index 8b4333dc55..b8d806b708 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -340,7 +340,13 @@ fn eval_redirection( } Ok(Redirection::file(options.create(true).open(path)?)) } - RedirectionTarget::Pipe { .. } => Ok(Redirection::Pipe(next_out.unwrap_or(OutDest::Pipe))), + RedirectionTarget::Pipe { .. } => { + let dest = match next_out { + None | Some(OutDest::Capture) => OutDest::Pipe, + Some(next) => next, + }; + Ok(Redirection::Pipe(dest)) + } } } @@ -367,11 +373,12 @@ fn eval_element_redirection( } => { let stderr = eval_redirection::(engine_state, stack, target, None)?; if matches!(stderr, Redirection::Pipe(OutDest::Pipe)) { + let dest = match next_out { + None | Some(OutDest::Capture) => OutDest::Pipe, + Some(next) => next, + }; // e>| redirection, don't override current stack `stdout` - Ok(( - None, - Some(next_out.map(Redirection::Pipe).unwrap_or(stderr)), - )) + Ok((None, Some(Redirection::Pipe(dest)))) } else { Ok((next_out.map(Redirection::Pipe), Some(stderr))) }