为什么 dart 中的 Process 需要在每个 space 之后在列表中分隔参数?

Why does Process in dart need arguments separated in a list after every space?

为什么 Process.start 需要在每个 space 之后在列表中分隔参数?例如根据文档 https://api.flutter.dev/flutter/dart-io/Process/start.html 要在 test.dart 中 grep main,我们需要做

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

这不是更好的方法吗?

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

我认为这是由于程序解析命令行参数的方式所致。

对于人类来说,“选项类型”(-i) 之后应该是“选项值”(main) 是合理的。对于计算机来说不是。他们只是解析各个字符串并决定如何使用它们,具体取决于程序员如何使用这些信息。

如果计算机能够决定何时将参数拆分为 space 或不拆分,这将是不一致的,并且本质上无法解决(或至少太复杂)。

David Penkowoj 说的是正确的,但我想在他的回答中添加更多细节。

原因是这实际上是程序获取其参数的方式,作为字符串列表。如果你制作这个基本程序,你可以看到这个:

void main(List<String> args) {
  print(args);
}

然后我们可以使用终端执行程序:

>dart Whosebug.dart first second third
[first, second, third]

如您所见,我们的终端将每个参数作为参数列表中的单独 String 值发送到我们的程序中。

但是如果我们希望我们的参数是单个参数怎么办?好吧,在大多数终端中我们可以使用 "(看到“second”和“third”之间的逗号消失了):

>dart Whosebug.dart first "second third"
[first, second third]

但是 " 去哪儿了?嗯,这就是我们的终端(在我的例子中是 CMD)解释我的输入的方式,CMD 使用 " 来表示多个参数是否应该在一起,即使用空格分隔也是如此。

如果我们想将 " 作为参数发送,我们需要转义 " 字符以便 CMD 知道它应该将其视为参数的一部分:

>dart Whosebug.dart first "\"second third\""
[first, "second third"]

那么这和Process.start有什么关系呢?好吧,原因是 Process.start 不会通过终端(例如 CMD)启动您的应用程序。相反,它直接启动程序,因此不对参数进行任何解释。相反,参数直接发送到正在执行的程序。

如您所见,终端(如 CMD)的标准行为会用空格分隔参数。因此,如果您想像从终端一样启动程序,您还需要将参数作为单独的 String 对象分隔在 List<String>.