start静态方法

Future<Process> start(
  1. String executable,
  2. List<String> arguments, {
  3. String? workingDirectory,
  4. Map<String, String>? environment,
  5. bool includeParentEnvironment = true,
  6. bool runInShell = false,
  7. ProcessStartMode mode = ProcessStartMode.normal,
})

启动一个运行指定argumentsexecutable进程。

返回一个Future<Process>,当进程成功启动时完成,返回一个Process实例。该Process对象可用于与进程交互。如果进程无法启动,返回的Future将完成一个异常。

建议使用绝对路径作为executable,因为解析executable路径是特定平台的。在Windows上,environment参数中设置的任何PATH以及workingDirectory参数中设置的路径在解析executable路径时都被忽略。

使用workingDirectory设置进程的工作目录。请注意,在某些平台上,在执行进程之前会更改目录,这可能会在使用可执行文件和参数的相对路径时产生影响。

使用environment设置进程的环境变量。如果没有设置,则继承父进程的环境。目前,仅支持US-ASCII环境变量,如果传递了范围之外的代码点的环境变量,则很可能发生错误。

如果includeParentEnvironmenttrue,进程的环境将包括父进程的环境,其中environment具有优先权。默认值为true

如果runInShelltrue,则通过系统shell启动进程。在Linux和OS X上使用/bin/sh,而在Windows上使用%WINDIR%\system32\cmd.exe

注意:在Windows上,如果executable是批处理文件('.bat'或'.cmd'),无论runInShell的值如何,操作系统都可能在系统shell中启动它。这可能导致根据shell规则解析参数。例如

void main() async {
  // Will launch notepad.
  Process.start('test.bat', ['test&notepad.exe']);
}

用户必须读取使用Process.start启动的进程的所有来自stdoutstderr流的全部数据。如果用户没有读取流上的所有数据,则底层系统资源将不会被释放,因为还有待处理的数据。

以下代码使用Process.start在Linux上搜索文件test.dart中的main

var process = await Process.start('grep', ['-i', 'main', 'test.dart']);
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);

如果 modeProcessStartMode.normal(默认值),则子进程将以 stdinstdoutstderr 连接到其父进程。只要子进程在运行,父进程就不会退出,除非父进程调用 exit。如果父进程调用 exit,则父进程将被终止,但子进程将继续运行。

如果 modeProcessStartMode.detached,则将创建一个独立进程。独立进程与其父进程没有连接,并且可以在父进程死亡时独立运行。从独立进程唯一可用的信息是它的 pid。它没有连接到其 stdinstdoutstderr,并且在它终止时,进程的退出代码将不可用。

如果 modeProcessStartMode.detachedWithStdio,则将创建一个独立进程,其中 stdinstdoutstderr 连接。创建者可以通过这些来与子进程通信。即使这些通信通道关闭或父进程死亡,独立进程也会继续运行。进程的退出代码在终止时将不可用。

mode 的默认值是 ProcessStartMode.normal

实现

external static Future<Process> start(
    String executable, List<String> arguments,
    {String? workingDirectory,
    Map<String, String>? environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    ProcessStartMode mode = ProcessStartMode.normal});