4

是否可以使用 Process.start() 设置环境变量?我试图从http://www.dartlang.org/articles/io/调整流程示例,但我收到错误。

Process.start("export my_key='abc123'", []).then((process) {
  var stdoutStream = new StringInputStream(process.stdout);
  stdoutStream.onLine = () => print(stdoutStream.readLine());
  process.stderr.onData = process.stderr.read;
  process.onExit = (exitCode) {
    print('exit code: $exitCode');
};

错误:

Unhandled exception:
FutureUnhandledException: exception while executing Future
  ProcessException: No such file or directory
    Command: export my_key='abc123' 
original stack trace:
  null
#0      _FutureImpl._complete (bootstrap:844:11)
#1      _FutureImpl._complete (bootstrap:848:5)
#2      _FutureImpl._setException (bootstrap:873:14)
#3      _CompleterImpl.completeException (bootstrap:948:30)
#4      _ProcessImpl._start.<anonymous closure> (dart:io-patch:198:37)
#5      _Timer._createTimerHandler._handleTimeout (dart:io:6918:28)
#6      _Timer._createTimerHandler._handleTimeout (dart:io:6926:7)
#7      _Timer._createTimerHandler.<anonymous closure> (dart:io:6934:23)
#8      _ReceivePortImpl._handleMessage (dart:isolate-patch:37:92)
4

1 回答 1

8

不幸的是,你不能。首先这是因为export它实际上是 bash(或其他几个 shell)的 shell 命令,而不是系统上的实际应用程序。Dart 不在 shell 中执行进程。

一个选项是bash -c 'export my_key=123'用作传递给 Process.start 的参数,但这也非常有限,因为导出的变量仅在 bash 会话期间存在。也就是说,一旦您生成的进程终止,您的变量就不再存在。

如果您想查看此操作,请在命令提示符下尝试以下操作:

bash -c 'export TEST="true";echo $TEST'

这将创建一个新的 bash 会话,导出变量,然后显示变量。一旦你有你的提示尝试然后运行:

echo $TEST

通过它自己。您应该会看到一个空行(如果您的系统上已经存在,则应该看到一个不同的值)。

也就是说,如果您想在运行不同的进程之前设置环境变量,请使用ProcessOptions类设置环境变量,然后将其传递给您的 Process.start :

import 'dart:io';

void main() {
  var po = new ProcessOptions();
  var ev = {'TEST': 'True'};
  po.environment = ev;
  Process.start('bash', ['-c','export'], po).then((process) {
    var stdoutStream = new StringInputStream(process.stdout);
    stdoutStream.onLine = () => print(stdoutStream.readLine());
    process.stderr.onData = process.stderr.read;
  });
}
于 2012-12-18T19:53:44.310 回答