implemented read command for ex mode
This commit is contained in:
57
src/jobs.rs
57
src/jobs.rs
@@ -598,26 +598,29 @@ impl Job {
|
||||
.map(|chld| chld.stat())
|
||||
.collect::<Vec<WtStat>>()
|
||||
}
|
||||
pub fn pipe_status(stats: &[WtStat]) -> Option<Vec<i32>> {
|
||||
if stats.iter()
|
||||
.any(|stat| matches!(stat, WtStat::StillAlive | WtStat::Continued(_) | WtStat::PtraceSyscall(_)))
|
||||
|| stats.len() <= 1 {
|
||||
return None;
|
||||
}
|
||||
Some(stats.iter()
|
||||
.map(|stat| {
|
||||
match stat {
|
||||
WtStat::Exited(_, code) => *code,
|
||||
WtStat::Signaled(_, signal, _) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::Stopped(_, signal) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::PtraceEvent(_, signal, _) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::PtraceSyscall(_) |
|
||||
WtStat::Continued(_) |
|
||||
WtStat::StillAlive => unreachable!()
|
||||
}
|
||||
})
|
||||
.collect())
|
||||
}
|
||||
pub fn pipe_status(stats: &[WtStat]) -> Option<Vec<i32>> {
|
||||
if stats.iter().any(|stat| {
|
||||
matches!(
|
||||
stat,
|
||||
WtStat::StillAlive | WtStat::Continued(_) | WtStat::PtraceSyscall(_)
|
||||
)
|
||||
}) || stats.len() <= 1
|
||||
{
|
||||
return None;
|
||||
}
|
||||
Some(
|
||||
stats
|
||||
.iter()
|
||||
.map(|stat| match stat {
|
||||
WtStat::Exited(_, code) => *code,
|
||||
WtStat::Signaled(_, signal, _) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::Stopped(_, signal) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::PtraceEvent(_, signal, _) => SIG_EXIT_OFFSET + *signal as i32,
|
||||
WtStat::PtraceSyscall(_) | WtStat::Continued(_) | WtStat::StillAlive => unreachable!(),
|
||||
})
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
pub fn get_pids(&self) -> Vec<Pid> {
|
||||
self
|
||||
.children
|
||||
@@ -877,14 +880,14 @@ pub fn wait_fg(job: Job, interactive: bool) -> ShResult<()> {
|
||||
_ => { /* Do nothing */ }
|
||||
}
|
||||
}
|
||||
if let Some(pipe_status) = Job::pipe_status(&statuses) {
|
||||
let pipe_status = pipe_status
|
||||
.into_iter()
|
||||
.map(|s| s.to_string())
|
||||
.collect::<VecDeque<String>>();
|
||||
if let Some(pipe_status) = Job::pipe_status(&statuses) {
|
||||
let pipe_status = pipe_status
|
||||
.into_iter()
|
||||
.map(|s| s.to_string())
|
||||
.collect::<VecDeque<String>>();
|
||||
|
||||
write_vars(|v| v.set_var("PIPESTATUS", VarKind::Arr(pipe_status), VarFlags::NONE))?;
|
||||
}
|
||||
write_vars(|v| v.set_var("PIPESTATUS", VarKind::Arr(pipe_status), VarFlags::NONE))?;
|
||||
}
|
||||
// If job wasn't stopped (moved to bg), clear the fg slot
|
||||
if !was_stopped {
|
||||
write_jobs(|j| {
|
||||
|
||||
Reference in New Issue
Block a user