在运行Node脚本时,更改当前shell上下文中的工作目录

我试图改变我的Node.js脚本从bin脚本运行的工作目录。 我有如下的东西:

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

当我用./bin/nodefile运行这个文件时,它退出,但是当前shell上下文的工作目录没有改变。 我也试过shelljs ,但是这也行不通。

做这个的最好方式是什么? 我知道它正在工作,但只是在一个单独的过程。

更改目录的正确方法实际上是使用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中testing:

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

Node没有内置方法来更改运行Node进程的底层Shell的CWD。

可以通过命令process.chdir()更改Node进程的当前工作目录。

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

当Node进程存在的时候,你会发现自己回到你开始进程的CWD中。

你试图做的是不可能的。 原因是在POSIX系统(Linux,OSX等)中,subprocess不能修改父进程的环境。 这包括修改父进程的工作目录和环境variables。

当你在命令行上,你去执行你的Node脚本时,你当前的进程( bashzsh ,whatever)产生一个新的进程,它有自己的环境,通常是你当前环境的一个副本(可以通过改变系统调用;但这超出了本答复的范围),允许该进程在完全隔离的情况下执行任何需要的操作。 当subprocess退出时,控制权交还给你的shell进程,环境没有受到影响。

这有很多原因,但是对于其中一个,想象一下你在后台执行脚本(通过./foo.js & ),当它运行时,它开始改变你的工作目录或覆盖你的PATH 。 那将是一场噩梦。

如果您需要执行一些需要更改您的shell的工作目录的操作,则需要在shell中编写一个函数。 例如,如果你正在运行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脚本。

这是你能够完成你想要做的事情的唯一方法。

简单的回答:不(方便?)的方式,但你可以做一些符合你的目的的东西。

我做了一个类似的工具(一个小命令,给定一个项目的描述,设置环境,path,目录等)。 我所做的是设置一切,然后产生一个shell:

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

执行后,你将在新的目录(在我的情况下,环境)的shell。 当然,你可以改变任何你喜欢的shell。 与您最初要求的主要区别是:

  • 还有一个额外的过程,所以…
  • 你必须写'退出'回来,然后…
  • 现有之后,所有的变化都被撤消了。

但是,对我而言,这种差异是可取的。