diff --git a/src/elements/subword/command.rs b/src/elements/subword/command.rs index 115043e8..6b3202da 100644 --- a/src/elements/subword/command.rs +++ b/src/elements/subword/command.rs @@ -31,10 +31,7 @@ impl Subword for CommandSubstitution { let pid = self.command.exec(core, &mut pipe)?; let result = self.read(pipe.recv, core); proc_ctrl::wait_pipeline(core, vec![pid], false, false); - match result { - true => Ok(()), - false => Err(ExecError::Other("command substitution error".to_string())), - } + result } } @@ -48,27 +45,31 @@ impl CommandSubstitution { false } - fn interrupted(&mut self, count: usize, core: &mut ShellCore) -> bool { + fn interrupted(&mut self, count: usize, core: &mut ShellCore) -> Result<(), ExecError> { if count%100 == 99 { //To receive Ctrl+C thread::sleep(time::Duration::from_millis(1)); } - core.sigint.load(Relaxed) + match core.sigint.load(Relaxed) { + true => Err(ExecError::Interrupted), + false => Ok(()), + } } - fn read(&mut self, fd: RawFd, core: &mut ShellCore) -> bool { + fn read(&mut self, fd: RawFd, core: &mut ShellCore) -> Result<(), ExecError> { let f = unsafe { File::from_raw_fd(fd) }; let reader = BufReader::new(f); self.text.clear(); for (i, line) in reader.lines().enumerate() { - if self.interrupted(i, core) { - break; - } + self.interrupted(i, core)?; if ! self.set_line(line) { - return false; + break; } } - self.text.pop(); - true + + if ! self.text.is_empty() { + self.text.pop(); + } + Ok(()) } pub fn parse(feeder: &mut Feeder, core: &mut ShellCore) -> Result, ParseError> { diff --git a/src/error/.exec.rs.swp b/src/error/.exec.rs.swp new file mode 100644 index 00000000..792e0e68 Binary files /dev/null and b/src/error/.exec.rs.swp differ diff --git a/test/ok b/test/ok index fb8e72f0..d6117d26 100644 --- a/test/ok +++ b/test/ok @@ -6,6 +6,6 @@ ./test_builtins.bash ./test_others.bash ./test_calculation.bash -./test_parameters.bash ./test_compound.bash +./test_parameters.bash ./test_job.bash