diff --git a/crates/nu-command/src/core_commands/do_.rs b/crates/nu-command/src/core_commands/do_.rs index 79dfb29c0a..0fa103865b 100644 --- a/crates/nu-command/src/core_commands/do_.rs +++ b/crates/nu-command/src/core_commands/do_.rs @@ -215,17 +215,35 @@ impl Command for Do { span, metadata, trim_end_newline, - }) if ignore_program_errors => Ok(PipelineData::ExternalStream { - stdout, - stderr, - exit_code: None, - span, - metadata, - trim_end_newline, - }), + }) if ignore_program_errors && !call.redirect_stdout => { + Ok(PipelineData::ExternalStream { + stdout, + stderr, + exit_code: None, + span, + metadata, + trim_end_newline, + }) + } Ok(PipelineData::Value(Value::Error { .. }, ..)) | Err(_) if ignore_shell_errors => { Ok(PipelineData::empty()) } + Ok(PipelineData::ListStream(ls, metadata)) if ignore_shell_errors => { + // check if there is a `Value::Error` in given list stream first. + let mut values = vec![]; + let ctrlc = ls.ctrlc.clone(); + for v in ls { + if let Value::Error { .. } = v { + values.push(Value::nothing(call.head)); + } else { + values.push(v) + } + } + Ok(PipelineData::ListStream( + ListStream::from_stream(values.into_iter(), ctrlc), + metadata, + )) + } r => r, } } diff --git a/crates/nu-command/tests/commands/do_.rs b/crates/nu-command/tests/commands/do_.rs index edb83c647e..c78093c483 100644 --- a/crates/nu-command/tests/commands/do_.rs +++ b/crates/nu-command/tests/commands/do_.rs @@ -187,3 +187,9 @@ fn capture_error_with_both_stdout_stderr_messages_not_hang_nushell() { }, ) } + +#[test] +fn ignore_error_works_with_list_stream() { + let actual = nu!(cwd: ".", pipeline(r#"do -i { ["a", $nothing, "b"] | ansi strip }"#)); + assert!(actual.err.is_empty()); +}