gpt4 book ai didi

process - 执行任何 bash 命令,立即获取 stdout/stderr 的结果并使用 stdin

转载 作者:行者123 更新时间:2023-11-29 08:20:35 26 4
gpt4 key购买 nike

我想执行任何 bash 命令。我找到了 Command::new 但我无法执行诸如 ls 之类的“复杂”命令; sleep 1; ls。此外,即使我将它放在 bash 脚本中并执行它,我也只会在脚本末尾得到结果(如流程文档中所述)。我希望在命令打印结果后立即获得结果(并且能够读取输入),就像我们在 bash 中那样。

最佳答案

Command::new 确实是要走的路,但它是为了执行程序。 ls; sleep 1; ls 不是一个程序,它是一些 shell 的指令。如果您想执行类似的操作,您需要让 shell 为您解释:

Command::new("/usr/bin/sh").args(&["-c", "ls ; sleep 1; ls"])
// your complex command is just an argument for the shell

获取输出有两种方式:

  • output方法正在阻塞并返回命令的输出和退出状态。
  • spawn方法是非阻塞的,并返回一个包含子进程 stdinstdoutstderr 的句柄,以便您可以与子进程通信,以及wait等待它干净退出的方法。请注意,默认情况下,子级继承其父级文件描述符,您可能希望改为设置管道:

你应该使用类似的东西:

let child = Command::new("/usr/bin/sh")
.args(&["-c", "ls sleep 1 ls"])
.stderr(std::process::Stdio::null()) // don't care about stderr
.stdout(std::process::Stdio::piped()) // set up stdout so we can read it
.stdin(std::process::Stdio::piped()) // set up stdin so we can write on it
.spawn().expect("Could not run the command"); // finally run the command

write_something_on(child.stdin);
read(child.stdout);

关于process - 执行任何 bash 命令,立即获取 stdout/stderr 的结果并使用 stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com