2012-12-18 131 views
3

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

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) 
+1

说“我收到了错误“,但没有告诉我们错误是什么是绝对没有意义的。我们无法从这里看到您的屏幕或阅读您的想法。 –

+0

添加到帖子中的错误。谢谢。 – basheps

回答

5

不幸的是,不,你不能。首先这是因为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; 
    }); 
} 
+0

谢谢您的解释和替代解决方案。 – basheps