为什么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']);
发布于 2021-04-13 04:15:20
David Penkowoj所说的是正确的,但我想在他的回答中添加更多细节。
原因是这实际上是程序获取其参数的方式,就像String列表一样。如果你编写这个基本的程序,你可以看到这个:
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)用空格分隔参数。因此,如果想要像从终端启动程序一样,还需要在List<String>中将参数作为单独的String对象进行分隔。
发布于 2021-04-13 03:16:28
我相信这是由于程序解析命令行参数的方式造成的。
对于人类来说,在“选项类型”(-i)之后应该有一个“选项值”(main)是合理的。对于计算机来说就不是了。它们只是解析单个字符串并决定如何使用它们,这取决于程序员如何使用信息。
这将是不一致的,并且本质上是不可解的(或者至少太复杂了),让计算机能够决定何时将参数拆分到空格上。
https://stackoverflow.com/questions/67063099
复制相似问题