Невозможно передать в или из порожденного дочернего процесса более одного раза

Я хочу иметь возможность использовать 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, учебниках или в переполнении стека.

Ответы на вопрос(1)

Ваш ответ на вопрос