あなたがやろうとしていることは不可能です。これは、POSIX システム (Linux、OSX など) では、子プロセスが親プロセスの環境を変更できないためです。これには、親プロセスの作業ディレクトリと環境変数の変更が含まれます。
コマンドラインで Node スクリプトを実行すると、現在のプロセス ( bash
、zsh
など) は、独自の環境 (通常は現在の環境のコピー) を持つ新しいプロセスを生成します (システム コールを介してこれを変更することができます)。 ; しかし、それはこの返信の範囲を超えています)、そのプロセスが必要なことを完全に分離して実行できるようにします。サブプロセスが終了すると、環境が影響を受けていないシェルのプロセスに制御が戻されます。
これには多くの理由がありますが、その 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 スクリプトを呼び出すことができます。
これが、やろうとしていることを達成できる唯一の方法です。