如何在作为子进程运行的shell中执行链接的命令?

时间:2020-09-09 11:19:22

标签: rust

How to execute a command in a shell running as a child process?处,我要执行多个命令。

let mut child = Command::new("sh").stdin(Stdio::piped())
    .stderr(Stdio::piped())
    .stdout(Stdio::piped())
    .spawn()?;

child.stdin
    .as_mut()
    .ok_or("Child process stdin has not been captured!")?
    .write_all(b"something...")?;

let output = child.wait_with_output()?;

有可能做这样的事情吗?

.write_all(b"something...")?
.write_all(b"something...")?;

2 个答案:

答案 0 :(得分:0)

链接方法调用适用于按照约定返回self&mut self的方法。无法保证 all 方法能够做到这一点,有些方法只是具有更有用的返回值。例如,write_all()返回Result<(), io::Error>,声明它除了显示写入成功还是失败之外没有其他价值。

要两次调用这种方法,您需要将值保存到局部变量中

let child_stdin = child
    .stdin
    .as_mut()
    .ok_or("Child process stdin has not been captured!")?;
child_stdin.write_all(b"something...")?;
child_stdin.write_all(b"something...")?;

答案 1 :(得分:0)

这不是 Rust 中的问题,而是 sh 。在 sh 中,您需要用换行符("\n")分隔命令:

//...
.write_all(b"command1\ncommand2")?;
//...

这也应该起作用:

//...
let child_stdin = child.stdin
    .as_mut()
    .ok_or("Child process stdin has not been captured!")?;

child_stdin.write_all(b"command1\n")?;
child_stdin.write_all(b"command2\n")?;
//...