在运行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脚本时,你当前的进程( bash
, zsh
,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。 与您最初要求的主要区别是:
- 还有一个额外的过程,所以…
- 你必须写'退出'回来,然后…
- 现有之后,所有的变化都被撤消了。
但是,对我而言,这种差异是可取的。