diff --git a/src/builtin/shopt.rs b/src/builtin/shopt.rs index 96dc4f6..4541d57 100644 --- a/src/builtin/shopt.rs +++ b/src/builtin/shopt.rs @@ -3,8 +3,8 @@ use crate::{ libsh::error::{ShResult, ShResultExt}, parse::{NdRule, Node}, prelude::*, - procio::{borrow_fd, IoStack}, - state::write_shopts, + procio::{IoStack, borrow_fd}, + state::{self, write_shopts}, }; use super::setup_builtin; @@ -20,6 +20,17 @@ pub fn shopt(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult< let (argv, _guard) = setup_builtin(argv, job, Some((io_stack, node.redirs)))?; + if argv.is_empty() { + let mut output = write_shopts(|s| s.display_opts())?; + + let output_channel = borrow_fd(STDOUT_FILENO); + output.push('\n'); + + write(output_channel, output.as_bytes())?; + state::set_status(0); + return Ok(()) + } + for (arg, span) in argv { let Some(mut output) = write_shopts(|s| s.query(&arg)).blame(span)? else { continue; @@ -28,10 +39,10 @@ pub fn shopt(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult< let output_channel = borrow_fd(STDOUT_FILENO); output.push('\n'); - if let Err(e) = write(output_channel, output.as_bytes()) { - return Err(e.into()); - } + write(output_channel, output.as_bytes())?; } + + state::set_status(0); Ok(()) } diff --git a/src/shopt.rs b/src/shopt.rs index eee0080..f1e0078 100644 --- a/src/shopt.rs +++ b/src/shopt.rs @@ -83,6 +83,15 @@ impl ShOpts { } } + pub fn display_opts(&mut self) -> ShResult { + let output = [ + format!("core:\n{}", self.query("core")?.unwrap_or_default()), + format!("prompt:\n{}",self.query("prompt")?.unwrap_or_default()) + ]; + + Ok(output.join("\n")) + } + pub fn set(&mut self, opt: &str, val: &str) -> ShResult<()> { let mut query = opt.split('.'); let Some(key) = query.next() else {