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 (または他のいくつかのシェル) のシェル コマンドであり、システム上の実際のアプリケーションではないためです。Dart はシェル内でプロセスを実行しません。

オプションは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 に答える