ノードスクリプトの実行時に現在のシェルコンテキストで作業ディレクトリを変更する


113

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

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

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

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


CWDが変化しなかったという証拠はありますか?require()とcwdで使用されるパスは2つの異なるものであることを覚えておいてください。
jeesty

Windowsでこれを行う方法はありますか?
フィリップ、

回答:


145

ディレクトリを変更する正しい方法は、実際にはを使用することprocess.chdir(directory)です。ドキュメントの例は次のとおりです。

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

これはNode.js REPLでもテストできます。

[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'

おっとっと。ええ、それは私が実際に使っているコマンドです。ただし、単純なスクリプトで使用すると、まだ機能しないようです(スクリプトが終了しても、まだ古いディレクトリにいます)。process.cwd()を呼び出すと、ディレクトリにいると表示されます私がpwdを呼び出すと、端末は別の何かにいると言います。別のプロセスだから?
Jonovono 2013年

10
このメソッドは、シェルではなく、プロセスの現在の作業ディレクトリを変更します。私の知る限り、実行中のプロセスの外部cwdを変更することは非常に複雑であり、推奨されません。これをしたい理由は何ですか?
ヘキサシアニド2013年

3
うーん。わかりました。私がこれをやりたいのは、プロジェクトを整理するためのターミナルアプリを作成しているからです。したがって、基本的にはプロジェクトを一覧表示して、現在のシェルの場所を簡単に変更できるようにしたいと考えています。それについて考えたところで、z(github.com/rupa/z)がこれをどのように行うかを調べます。それはbashで行われますが。私はおそらくこれをapplescriptで行うことができますか?
Jonovono 2013年

@hexacyanide追加への感謝は、変更が調整されなかったために気になりました
Eugen Sunic

33

Nodeプロセスが実行されている基になるシェルの CWDを変更するNodeの組み込みメソッドはありません。

あなたはできるの現在の作業ディレクトリに変更ノードのプロセスをコマンドでprocess.chdir()

var process = require('process');
process.chdir('../');

ノードプロセスが存在する場合、プロセスを開始したCWDに戻ります。


14

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

あなたはコマンドラインであり、あなたは(あなたの現在のプロセスを、あなたのノードのスクリプトを実行するために行くとき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スクリプトを呼び出すことができます。

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


10

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

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

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

実行後、新しいディレクトリ(そして私の場合は環境)を含むシェルが表示されます。もちろん、好きなシェルのbashを変更できます。最初に要求したものとの主な違いは次のとおりです。

  • 追加のプロセスがあるので...
  • 戻るには「exit」と書かなければなりません...
  • 存在すると、すべての変更が元に戻されます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.