如何解决为什么 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 举报,一经查实,本站将立刻删除。