diff --git a/src/shell/mod.rs b/src/shell/mod.rs index e3ab8737919d3da67096a0e8a48ca9de7d7c38b7..7d6b4bdda462377ee2cf7e49b79b82584e7b4261 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -158,52 +158,63 @@ impl<'a> Shell<'a> { } pub fn execute(&mut self) { - let mut dash_c = false; - for arg in env::args().skip(1) { - if arg == "-c" { - dash_c = true; - } else { - if dash_c { + let mut args = env::args().skip(1); + + if let Some(path) = args.next() { + if path == "-c" { + if let Some(arg) = args.next() { + for (i, arg) in args.enumerate() { + self.variables.set_var(&format!("{}", i), &arg); + } + self.on_command(&arg); } else { - match File::open(&arg) { - Ok(mut file) => { - let capacity = file.metadata().ok().map_or(0, |x| x.len()); - let mut command_list = String::with_capacity(capacity as usize); - match file.read_to_string(&mut command_list) { - Ok(_) => { - let mut lines = command_list.lines().map(|x| x.to_owned()); - while let Some(command) = lines.next() { - let mut buffer = QuoteTerminator::new(command); - while !buffer.check_termination() { - loop { - if let Some(command) = lines.next() { - buffer.append(command); - break - } + let stderr = io::stderr(); + let mut stderr = stderr.lock(); + let _ = writeln!(stderr, "ion: -c requires an argument"); + } + } else { + self.variables.set_var("0", &path); + for (i, arg) in args.enumerate() { + self.variables.set_var(&format!("{}", i + 1), &arg); + } + + match File::open(&path) { + Ok(mut file) => { + let capacity = file.metadata().ok().map_or(0, |x| x.len()); + let mut command_list = String::with_capacity(capacity as usize); + match file.read_to_string(&mut command_list) { + Ok(_) => { + let mut lines = command_list.lines().map(|x| x.to_owned()); + while let Some(command) = lines.next() { + let mut buffer = QuoteTerminator::new(command); + while !buffer.check_termination() { + loop { + if let Some(command) = lines.next() { + buffer.append(command); + break } } - self.on_command(&buffer.consume()); } - }, - Err(err) => { - let stderr = io::stderr(); - let mut stderr = stderr.lock(); - let _ = writeln!(stderr, "ion: failed to read {}: {}", arg, err); + self.on_command(&buffer.consume()); } + }, + Err(err) => { + let stderr = io::stderr(); + let mut stderr = stderr.lock(); + let _ = writeln!(stderr, "ion: failed to read {}: {}", path, err); } - }, - Err(err) => { - let stderr = io::stderr(); - let mut stderr = stderr.lock(); - let _ = writeln!(stderr, "ion: failed to open {}: {}", arg, err); } + }, + Err(err) => { + let stderr = io::stderr(); + let mut stderr = stderr.lock(); + let _ = writeln!(stderr, "ion: failed to open {}: {}", path, err); } } - - // Exit with the previous command's exit status. - process::exit(self.previous_status); } + + process::exit(self.previous_status); } while let Some(command) = self.readln() {