diff --git a/src/lib/shell/mod.rs b/src/lib/shell/mod.rs index df9cca71a835874105d1b26450617c1510871af1..f55354d694f225c3aac5fcec25921771a1873758 100644 --- a/src/lib/shell/mod.rs +++ b/src/lib/shell/mod.rs @@ -17,6 +17,7 @@ use self::{ directory_stack::DirectoryStack, flow_control::{Block, Function, FunctionError, Statement}, pipe_exec::foreground, + sys::NULL_PATH, variables::Variables, }; pub use self::{ @@ -30,7 +31,10 @@ pub use self::{ use crate::{ assignments::value_check, builtins::{BuiltinMap, Status}, - expansion::{pipelines::Pipeline, Error as ExpansionError}, + expansion::{ + pipelines::{PipeType, Pipeline}, + Error as ExpansionError, + }, parser::{ lexers::{Key, Primitive}, Error as ParseError, Terminator, @@ -290,6 +294,14 @@ impl<'a> Shell<'a> { let command_start_time = SystemTime::now(); let mut pipeline = pipeline.expand(self)?; + + let null_file = + if pipeline.pipe == PipeType::Disown { File::open(NULL_PATH).ok() } else { None }; + let (stderr, stdout) = ( + null_file.as_ref().or(self.stderr.as_ref()), + null_file.as_ref().or(self.stdout.as_ref()), + ); + for item in &mut pipeline.items { // TODO: Once the rust version is shifted to 1.33, use the transpose method item.job.stdin = if let Some(file) = &self.stdin { @@ -297,12 +309,12 @@ impl<'a> Shell<'a> { } else { None }; - item.job.stdout = if let Some(file) = &self.stdout { + item.job.stdout = if let Some(file) = &stdout { Some(file.try_clone().map_err(PipelineError::ClonePipeFailed)?) } else { None }; - item.job.stderr = if let Some(file) = &self.stderr { + item.job.stderr = if let Some(file) = &stderr { Some(file.try_clone().map_err(PipelineError::ClonePipeFailed)?) } else { None