为什么 dart 中的 Process 需要在每个 space 之后在列表中分隔参数?
Why does Process in dart need arguments separated in a list after every space?
为什么 Process.start
需要在每个 space 之后在列表中分隔参数?例如根据文档 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']);
我认为这是由于程序解析命令行参数的方式所致。
对于人类来说,“选项类型”(-i) 之后应该是“选项值”(main) 是合理的。对于计算机来说不是。他们只是解析各个字符串并决定如何使用它们,具体取决于程序员如何使用这些信息。
如果计算机能够决定何时将参数拆分为 space 或不拆分,这将是不一致的,并且本质上无法解决(或至少太复杂)。
David Penkowoj 说的是正确的,但我想在他的回答中添加更多细节。
原因是这实际上是程序获取其参数的方式,作为字符串列表。如果你制作这个基本程序,你可以看到这个:
void main(List<String> args) {
print(args);
}
然后我们可以使用终端执行程序:
>dart Whosebug.dart first second third
[first, second, third]
如您所见,我们的终端将每个参数作为参数列表中的单独 String
值发送到我们的程序中。
但是如果我们希望我们的参数是单个参数怎么办?好吧,在大多数终端中我们可以使用 "
(看到“second”和“third”之间的逗号消失了):
>dart Whosebug.dart first "second third"
[first, second third]
但是 "
去哪儿了?嗯,这就是我们的终端(在我的例子中是 CMD)解释我的输入的方式,CMD 使用 "
来表示多个参数是否应该在一起,即使用空格分隔也是如此。
如果我们想将 "
作为参数发送,我们需要转义 "
字符以便 CMD 知道它应该将其视为参数的一部分:
>dart Whosebug.dart first "\"second third\""
[first, "second third"]
那么这和Process.start
有什么关系呢?好吧,原因是 Process.start
不会通过终端(例如 CMD)启动您的应用程序。相反,它直接启动程序,因此不对参数进行任何解释。相反,参数直接发送到正在执行的程序。
如您所见,终端(如 CMD)的标准行为会用空格分隔参数。因此,如果您想像从终端一样启动程序,您还需要将参数作为单独的 String
对象分隔在 List<String>
.
中
为什么 Process.start
需要在每个 space 之后在列表中分隔参数?例如根据文档 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']);
我认为这是由于程序解析命令行参数的方式所致。
对于人类来说,“选项类型”(-i) 之后应该是“选项值”(main) 是合理的。对于计算机来说不是。他们只是解析各个字符串并决定如何使用它们,具体取决于程序员如何使用这些信息。
如果计算机能够决定何时将参数拆分为 space 或不拆分,这将是不一致的,并且本质上无法解决(或至少太复杂)。
David Penkowoj 说的是正确的,但我想在他的回答中添加更多细节。
原因是这实际上是程序获取其参数的方式,作为字符串列表。如果你制作这个基本程序,你可以看到这个:
void main(List<String> args) {
print(args);
}
然后我们可以使用终端执行程序:
>dart Whosebug.dart first second third
[first, second, third]
如您所见,我们的终端将每个参数作为参数列表中的单独 String
值发送到我们的程序中。
但是如果我们希望我们的参数是单个参数怎么办?好吧,在大多数终端中我们可以使用 "
(看到“second”和“third”之间的逗号消失了):
>dart Whosebug.dart first "second third"
[first, second third]
但是 "
去哪儿了?嗯,这就是我们的终端(在我的例子中是 CMD)解释我的输入的方式,CMD 使用 "
来表示多个参数是否应该在一起,即使用空格分隔也是如此。
如果我们想将 "
作为参数发送,我们需要转义 "
字符以便 CMD 知道它应该将其视为参数的一部分:
>dart Whosebug.dart first "\"second third\""
[first, "second third"]
那么这和Process.start
有什么关系呢?好吧,原因是 Process.start
不会通过终端(例如 CMD)启动您的应用程序。相反,它直接启动程序,因此不对参数进行任何解释。相反,参数直接发送到正在执行的程序。
如您所见,终端(如 CMD)的标准行为会用空格分隔参数。因此,如果您想像从终端一样启动程序,您还需要将参数作为单独的 String
对象分隔在 List<String>
.