54 lines
1.2 KiB
Rust
54 lines
1.2 KiB
Rust
use shellenv::jobs::{ChildProc, JobBldr};
|
|
|
|
use crate::prelude::*;
|
|
|
|
pub fn echo(node: Node, shenv: &mut ShEnv) -> ShResult<()> {
|
|
let rule = node.into_rule();
|
|
|
|
if let NdRule::Command { argv, redirs } = rule {
|
|
let argv = argv.drop_first().as_strings(shenv);
|
|
let mut formatted = argv.join(" ");
|
|
formatted.push('\n');
|
|
|
|
if shenv.ctx().flags().contains(ExecFlags::NO_FORK) {
|
|
shenv.collect_redirs(redirs);
|
|
if let Err(e) = shenv.ctx_mut().activate_rdrs() {
|
|
eprintln!("{:?}",e);
|
|
exit(1);
|
|
}
|
|
if let Err(e) = write_out(formatted) {
|
|
eprintln!("{:?}",e);
|
|
exit(1);
|
|
}
|
|
exit(0);
|
|
} else {
|
|
match unsafe { fork()? } {
|
|
Child => {
|
|
shenv.collect_redirs(redirs);
|
|
if let Err(e) = shenv.ctx_mut().activate_rdrs() {
|
|
eprintln!("{:?}",e);
|
|
exit(1);
|
|
}
|
|
if let Err(e) = write_out(formatted) {
|
|
eprintln!("{:?}",e);
|
|
exit(1);
|
|
}
|
|
exit(0);
|
|
}
|
|
Parent { child } => {
|
|
shenv.reset_io()?;
|
|
let children = vec![
|
|
ChildProc::new(child, Some("echo"), Some(child))?
|
|
];
|
|
let job = JobBldr::new()
|
|
.with_children(children)
|
|
.with_pgid(child)
|
|
.build();
|
|
wait_fg(job, shenv)?;
|
|
}
|
|
}
|
|
}
|
|
} else { unreachable!() }
|
|
Ok(())
|
|
}
|