微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 dart 中的 Process 需要在每个空格后在列表中分隔参数?

为什么 Process.start 需要在列表中的每个空格后分​​隔参数?例如根据文档 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']);

解决方法

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

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

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

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

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

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

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

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

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

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

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

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

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

,

我相信这是由于程序解析命令行参数的方式造成的。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。