137

Node.js スクリプトが bin スクリプトから実行されているときに、その作業ディレクトリを変更しようとしています。私は次のようなものを持っています:

#!/usr/bin/env node
process.chdir('/Users')

次に、このファイルを./bin/nodefileで実行すると終了しますが、現在のシェル コンテキストの作業ディレクトリは変更されていません。shelljsも試しましたが、どちらも機能しません。

これを行う最善の方法は何ですか?私はそれが機能していることを理解していますが、それは別のプロセスにあります。

4

5 に答える 5

18

あなたがやろうとしていることは不可能です。これは、POSIX システム (Linux、OSX など) では、子プロセスが親プロセスの環境を変更できないためです。これには、親プロセスの作業ディレクトリと環境変数の変更が含まれます。

コマンドラインで Node スクリプトを実行すると、現在のプロセス ( bashzshなど) は、独自の環境 (通常は現在の環境のコピー) を持つ新しいプロセスを生成します (システム コールを介してこれを変更することができます)。 ; しかし、それはこの返信の範囲を超えています)、そのプロセスが必要なことを完全に分離して実行できるようにします。サブプロセスが終了すると、環境が影響を受けていないシェルのプロセスに制御が戻されます。

これには多くの理由がありますが、その 1 つとして、( 経由で) バックグラウンドでスクリプトを実行し、実行中に./foo.js &作業ディレクトリが変更されたり、PATH. それは悪夢でしょう。

シェルの作業ディレクトリを変更する必要があるアクションを実行する必要がある場合は、シェルに関数を記述する必要があります。たとえば、Bash を実行している場合は、次のように記述できます~/.bash_profile

do_cool_thing() {
  cd "/Users"
  echo "Hey, I'm in $PWD"
}

そして、このクールなことは実行可能です:

$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users

さらに複雑なことを行う必要がある場合は、いつでもその関数から nodejs スクリプトを呼び出すことができます。

これが、やろうとしていることを達成できる唯一の方法です。

于 2016-06-03T22:30:12.300 に答える
11

簡単な答え: いいえ (簡単な?) 方法ではありませんが、目的にかなうことができます。

同様のツール(プロジェクトの説明を指定して、環境、パス、ディレクトリなどを設定する小さなコマンド)を実行しました。私がしていることは、すべてをセットアップしてから、次のようにシェルを生成することです。

spawn('bash', ['-i'], {
  cwd: new_cwd,
  env: new_env,
  stdio: 'inherit'
});

実行後、新しいディレクトリ (および私の場合は環境) を持つシェルになります。もちろん、好みのシェルに合わせて bash を変更できます。あなたが最初に求めたものとの主な違いは次のとおりです。

  • 追加のプロセスがあるので...
  • 戻るには「exit」と書く必要があり、その後...
  • 既存の変更はすべて元に戻されます。

しかし、私にとっては、その違いは望ましいものです。

于 2016-01-06T13:44:09.840 に答える