48 lines
1.0 KiB
Rust
48 lines
1.0 KiB
Rust
use crate::{
|
|
jobs::JobBldr,
|
|
libsh::error::{ShResult, ShResultExt},
|
|
parse::{NdRule, Node},
|
|
prelude::*,
|
|
procio::{IoStack, borrow_fd},
|
|
state::{self, write_shopts},
|
|
};
|
|
|
|
use super::setup_builtin;
|
|
|
|
pub fn shopt(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult<()> {
|
|
let NdRule::Command {
|
|
assignments: _,
|
|
argv,
|
|
} = node.class
|
|
else {
|
|
unreachable!()
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
let output_channel = borrow_fd(STDOUT_FILENO);
|
|
output.push('\n');
|
|
|
|
write(output_channel, output.as_bytes())?;
|
|
}
|
|
|
|
state::set_status(0);
|
|
Ok(())
|
|
}
|