Невозможно передать в или из порожденного дочернего процесса более одного раза
Я хочу иметь возможность использовать Rust для порождения дочерней оболочки, затем многократно передавать ей произвольные команды и обрабатывать их результаты. Я нашел много примеров в Интернете, показывающих мне, как передать одну команду и получить ее единственный вывод, но я не могу сделать это повторно.
Например, следующий код висит на строке после комментария. (Я думаю, может быть,read_to_string()
блокируется, пока не получит стандартный вывод от дочернего процесса, но если это так, я не понимаю, почему этот вывод не поступит ..)
let mut child_shell = match Command::new("/bin/bash")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.spawn()
{
Err(why) => panic!("couldn't spawn child_shell: {}", Error::description(&why)),
Ok(process) => process,
};
loop {
{
match child_shell.stdin.as_mut().unwrap().write("ls".as_bytes()) {
Err(why) => panic!(
"couldn't send command to child shell: {}",
Error::description(&why)
),
Ok(_) => println!("sent command to child shell"),
}
}
{
let mut s = String::new();
// ↓ hangs on this line ↓
match child_shell.stdout.as_mut().unwrap().read_to_string(&mut s) {
Err(why) => panic!("couldn't read bash stdout: {}", Error::description(&why)),
Ok(_) => print!("bash responded with:\n{}", s),
}
}
}
Я новичок в Rust, и я думаю, что проблема заключается в моем ограниченном понимании правил заимствования / ссылок, поскольку вышеприведенное работает нормально (для одной итерации), если я удаляю инструкцию цикла из кода и изменяю ссылки на внутренностиstd::process::Child
структура неизменной; например из этого:
child_shell.stdin.as_mut().unwrap().write("ls".as_bytes())
к этому:
child_shell.stdin.unwrap().write("ls".as_bytes())
Очевидно, многократно работаетls
это не моя конечная цель, и я знаю, что мог бы просто написать сценарий оболочки, а затем запустить Rust несколько раз, но (кроме цели просто узнать больше о Rust!) мне нужно уметь это делать По крайней мере, в принципе, для более сложного проекта (который я с радостью расскажу, если он окажется актуальным для каких-либо решений, но, возможно, это далеко выходит за рамки этого вопроса!)
Наконец, если окажется, что невозможно использовать дочернюю оболочку таким образом, я, тем не менее, хотел бы узнать, как многократно / непрерывно передавать данные в и из порожденного процесса, выполняющего какую-то другую произвольную команду, как я не был ' не может найти какую-либо информацию в документации по Rust, учебниках или в переполнении стека.