Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 为什么dart中的进程需要在每个空格后的列表中分隔参数?_Flutter_Shell_Dart_Process - Fatal编程技术网

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

Flutter 为什么dart中的进程需要在每个空格后的列表中分隔参数?,flutter,shell,dart,process,Flutter,Shell,Dart,Process,为什么处理.start需要在每个空格后的列表中分隔参数?例如根据文件 要在test.dart中grep main,我们需要 var process=wait process.start('grep',['-i','main','test.dart']) 这不是更好的方法吗 var process=wait process.start('grep'、['-i main'、'test.dart'、'-other options'])我认为这是由于程序解析命令行参数的方式造成的 对于人类来说,在“期权

为什么
处理.start
需要在每个空格后的列表中分隔参数?例如根据文件 要在test.dart中grep main,我们需要

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

这不是更好的方法吗


var process=wait process.start('grep'、['-i main'、'test.dart'、'-other options'])

我认为这是由于程序解析命令行参数的方式造成的

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


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

大卫·彭科沃伊说的是正确的,但我想在他的回答中添加更多细节

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

void main(List<String> args) {
  print(args);
}
如您所见,终端将每个参数作为参数列表中的一个单独的
字符串
值发送到程序中

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

>dart stackoverflow.dart first“second third”
[第一,第二,第三]
但是嘿,
到哪里去了?好的,这就是我们的终端(在我的例子中是CMD)解释我的输入的方式,CMD使用
来表示多个参数是否应该在一起,即使是用空格分隔的

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

>dart stackoverflow.dart first“\“second third”
[第一,“第二第三”]
那么这与
Process.start
有什么关系呢?原因是
Process.start
不会通过终端(例如CMD)启动应用程序。相反,它会直接启动程序,因此不会对参数进行任何解释。相反,参数会直接发送到正在执行的程序


如您所见,终端的标准行为(如CMD)使用空格分隔参数。因此,如果您想像从终端启动程序一样启动程序,还需要将参数分隔为
列表中的单个
字符串
对象,后者将执行与运行
grep“-i main”test.dart”-其他选项等效的操作“
在命令行shell中。请注意,它不会做你想做的事情,这不是Dart的决定。