Struct std::process::Command1.0.0[][src]

pub struct Command { /* fields omitted */ }
Expand description

进程生成器,提供对如何生成新进程的细粒度控制。

可以使用 Command::new(program) 生成默认配置,其中 program 提供了要执行的程序的路径。

其他生成器方法允许在生成之前更改配置 (例如,通过添加参数) :

use std::process::Command;

let output = if cfg!(target_os = "windows") {
    Command::new("cmd")
            .args(["/C", "echo hello"])
            .output()
            .expect("failed to execute process")
} else {
    Command::new("sh")
            .arg("-c")
            .arg("echo hello")
            .output()
            .expect("failed to execute process")
};

let hello = output.stdout;
Run

Command 可以重用到 spawn 的多个进程。 构建器方法无需立即使进程 spawn 即可更改命令。

use std::process::Command;

let mut echo_hello = Command::new("sh");
echo_hello.arg("-c")
          .arg("echo hello");
let hello_1 = echo_hello.output().expect("failed to execute process");
let hello_2 = echo_hello.output().expect("failed to execute process");
Run

同样,您可以在生成进程之后调用构建器方法,然后使用修改后的设置 spawn 新建一个进程。

use std::process::Command;

let mut list_dir = Command::new("ls");

// 在程序的当前目录中执行 `ls`。
list_dir.status().expect("process failed to execute");

println!();

// 更改 `ls` 以在根目录中执行。
list_dir.current_dir("/");

// 然后再次在根目录中执行 `ls`。
list_dir.status().expect("process failed to execute");
Run

Implementations

使用以下默认配置创建一个新的 Command,以在路径 program 处启动该程序:

  • 程序无参数
  • 继承当前进程的环境
  • 继承当前进程的工作目录
  • spawnstatus 继承 stdin/stdout/stderr,但为 output 创建管道

提供了生成器方法来更改这些默认值,并以其他方式配置该进程。

如果 program 不是绝对路径,则将以 OS 定义的方式搜索 PATH

可以通过在 Command 上设置 PATH 环境变量来控制要使用的搜索路径,但这在 Windows 上有一些实现上的限制 (请参见 issue #37519)。

Examples

基本用法:

use std::process::Command;

Command::new("sh")
        .spawn()
        .expect("sh command failed to start");
Run

添加参数以传递给程序。

每次使用只能传递一个参数。因此,而不是:

.arg("-C /path/to/repo")
Run

用法是:

.arg("-C")
.arg("/path/to/repo")
Run

要传递多个参数,请参见 args

注意,该参数不是通过 shell 传递的,而是按字面意义提供给程序的。 这意味着 shell 语法,例如引号,转义字符,单词拆分,全局模式,替换等。

没有效果。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
Run

添加多个参数以传递给程序。

要传递单个参数,请参见 arg

请注意,该参数不是通过 shell 传递的,而是按字面意义提供给程序的。 这意味着 shell 语法,例如引号,转义字符,单词拆分,全局模式,替换等。

没有效果。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .args(["-l", "-a"])
        .spawn()
        .expect("ls command failed to start");
Run

插入或更新环境变量映射。

请注意,环境变量名称在 Windows 上不区分大小写 (但保留大小写),在所有其他平台上则区分大小写。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .env("PATH", "/bin")
        .spawn()
        .expect("ls command failed to start");
Run

添加或更新多个环境变量映射。

Examples

基本用法:

use std::process::{Command, Stdio};
use std::env;
use std::collections::HashMap;

let filtered_env : HashMap<String, String> =
    env::vars().filter(|&(ref k, _)|
        k == "TERM" || k == "TZ" || k == "LANG" || k == "PATH"
    ).collect();

Command::new("printenv")
        .stdin(Stdio::null())
        .stdout(Stdio::inherit())
        .env_clear()
        .envs(&filtered_env)
        .spawn()
        .expect("printenv failed to start");
Run

删除环境变量映射。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .env_remove("PATH")
        .spawn()
        .expect("ls command failed to start");
Run

清除子进程的整个环境 map。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .env_clear()
        .spawn()
        .expect("ls command failed to start");
Run

设置子进程的工作目录。

平台特定的行为

如果程序路径是相对路径 (例如 "./script.sh"),则是相对于父级工作目录还是相对于 current_dir 来解释路径。 这种情况下的行为是特定于平台且不稳定的,建议使用 canonicalize 来获取绝对程序路径。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .current_dir("/bin")
        .spawn()
        .expect("ls command failed to start");
Run

子进程的标准输入 (stdin) 句柄的配置。

spawnstatus 一起使用时默认为 inherit,与 output 一起使用时默认为 piped

Examples

基本用法:

use std::process::{Command, Stdio};

Command::new("ls")
        .stdin(Stdio::null())
        .spawn()
        .expect("ls command failed to start");
Run

子进程的标准输出 (stdout) 句柄的配置。

spawnstatus 一起使用时默认为 inherit,与 output 一起使用时默认为 piped

Examples

基本用法:

use std::process::{Command, Stdio};

Command::new("ls")
        .stdout(Stdio::null())
        .spawn()
        .expect("ls command failed to start");
Run

子进程的标准错误 (stderr) 句柄的配置。

spawnstatus 一起使用时默认为 inherit,与 output 一起使用时默认为 piped

Examples

基本用法:

use std::process::{Command, Stdio};

Command::new("ls")
        .stderr(Stdio::null())
        .spawn()
        .expect("ls command failed to start");
Run

将命令作为子进程执行,并返回其句柄。

默认情况下,stdin、stdout 和 stderr 都是从父级继承的。

Examples

基本用法:

use std::process::Command;

Command::new("ls")
        .spawn()
        .expect("ls command failed to start");
Run

将命令作为子进程执行,等待其完成并收集所有输出。

默认情况下,将捕获 stdout 和 stderr (并用于提供结果输出)。 Stdin 不是从父级继承的,子进程尝试从 stdin 流中进行读取的任何尝试都将导致该流立即关闭。

Examples

use std::process::Command;
use std::io::{self, Write};
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
io::stdout().write_all(&output.stdout).unwrap();
io::stderr().write_all(&output.stderr).unwrap();

assert!(output.status.success());
Run

将命令作为子进程执行,等待其完成并收集其状态。

默认情况下,stdin、stdout 和 stderr 都是从父级继承的。

Examples

use std::process::Command;

let status = Command::new("/bin/cat")
                     .arg("file.txt")
                     .status()
                     .expect("failed to execute process");

println!("process finished with: {}", status);

assert!(status.success());
Run
🔬 This is a nightly-only experimental API. (command_access #44434)

返回给 Command::new 的程序的路径。

Examples

use std::process::Command;

let cmd = Command::new("echo");
assert_eq!(cmd.get_program(), "echo");
Run
🔬 This is a nightly-only experimental API. (command_access #44434)

返回将传递给程序的参数的迭代器。

这不包括程序的路径作为第一个参数; 它仅包含 Command::argCommand::args 指定的参数。

Examples

use std::ffi::OsStr;
use std::process::Command;

let mut cmd = Command::new("echo");
cmd.arg("first").arg("second");
let args: Vec<&OsStr> = cmd.get_args().collect();
assert_eq!(args, &["first", "second"]);
Run
🔬 This is a nightly-only experimental API. (command_access #44434)

返回将在生成进程时设置的环境变量的迭代器。

每个元素都是一个元组 (&OsStr, Option<&OsStr>),其中第一个值为键,第二个为值,如果要显式删除环境变量,则为 None

这仅包括用 Command::envCommand::envsCommand::env_remove 显式设置的环境变量。 它不包括子进程将继承的环境变量。

Examples

use std::ffi::OsStr;
use std::process::Command;

let mut cmd = Command::new("ls");
cmd.env("TERM", "dumb").env_remove("TZ");
let envs: Vec<(&OsStr, Option<&OsStr>)> = cmd.get_envs().collect();
assert_eq!(envs, &[
    (OsStr::new("TERM"), Some(OsStr::new("dumb"))),
    (OsStr::new("TZ"), None)
]);
Run
🔬 This is a nightly-only experimental API. (command_access #44434)

返回子进程的工作目录。

如果不更改工作目录,则返回 None

Examples

use std::path::Path;
use std::process::Command;

let mut cmd = Command::new("ls");
assert_eq!(cmd.get_current_dir(), None);
cmd.current_dir("/bin");
assert_eq!(cmd.get_current_dir(), Some(Path::new("/bin")));
Run

Trait Implementations

This is supported on Unix only.

设置子进程的用户 ID。 这将转换为子进程中的 setuid 调用。 setuid 调用失败将导致 spawn 失败。 Read more

uid 相似,但是设置子进程的组 ID。 这具有与 uid 字段相同的语义。 Read more

🔬 This is a nightly-only experimental API. (setgroups #38527)

设置调用进程的补充组 ID。 在子进程中转换为 setgroups 调用。 Read more

计划在 exec 函数被调用之前运行一个闭包。 Read more

通过此 Command 执行所有必需的设置,然后调用 execvp syscall。 Read more

设置可执行参数 Read more

👎 Deprecated since 1.37.0:

should be unsafe, use pre_exec instead

计划在 exec 函数被调用之前运行一个闭包。 Read more

This is supported on Windows only.

设置要传递给 CreateProcessprocess creation flagsRead more

🔬 This is a nightly-only experimental API. (windows_process_extensions_force_quotes #82227)

强制所有参数用 (") 引号括起来。 Read more

🔬 This is a nightly-only experimental API. (windows_process_extensions_raw_arg #29494)

将字面量文本附加到命令行,无需任何引用或转义。 Read more

格式化命令的程序和参数以进行显示。 使用 utf8 替换字符有损地转换所有非 utf8 数据。

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。