首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么dart中的进程需要在每个空格后的列表中分隔参数?

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

Stack Overflow用户
提问于 2021-04-13 01:36:25
回答 2查看 88关注 0票数 0

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

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

这不是更好的方法吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-13 04:15:20

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

原因是这实际上是程序获取其参数的方式,就像String列表一样。如果你编写这个基本的程序,你可以看到这个:

代码语言:javascript
复制
void main(List<String> args) {
  print(args);
}

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

代码语言:javascript
复制
>dart stackoverflow.dart first second third
[first, second, third]

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

但是,如果我们希望我们的论点是一个单独的论点呢?在大多数终端中,我们都可以使用" (参见"second“和"third”之间的逗号已去掉):

代码语言:javascript
复制
>dart stackoverflow.dart first "second third"
[first, second third]

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

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

代码语言:javascript
复制
>dart stackoverflow.dart first "\"second third\""
[first, "second third"]

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-04-13 03:16:28

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

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

这将是不一致的,并且本质上是不可解的(或者至少太复杂了),让计算机能够决定何时将参数拆分到空格上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67063099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档