我正在尝试从bin脚本运行时更改Node.js脚本的工作目录。我有以下内容:
#!/usr/bin/env node
process.chdir('/Users')
当我用./bin/nodefile
运行此文件时,它会退出,但当前shell上下文的工作目录没有更改。我也尝试了shelljs,但这也不起作用。
最好的方法是什么?我知道它有效,但它只是在一个单独的过程中。
答案 0 :(得分:121)
更改目录的正确方法实际上是process.chdir(directory)
。以下是documentation:
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'
答案 1 :(得分:27)
Node没有内置方法来更改运行Node进程的底层shell 的CWD。 p>
您可以通过命令process.chdir()
更改节点进程的当前工作目录。
var process = require('process');
process.chdir('../');
当Node过程存在时,您会发现自己回到了开始该过程的CWD中。
答案 2 :(得分:12)
你想做的事是不可能的。原因是在POSIX系统(Linux,OSX等)中,子进程无法修改父进程的环境。这包括修改父进程的工作目录和环境变量。
当您在命令行上并执行Node脚本时,您当前的进程(bash
,zsh
,无论如何)会生成一个具有自己的环境的新进程,通常是您当前的环境(可以通过系统调用来更改它;但这超出了本回复的范围),允许该进程在完全隔离中执行它需要做的任何事情。当子进程退出时,控制权将交还给shell的进程,在该进程中环境不受影响。
这有很多原因,但是对于其中一个,假设您在后台执行了一个脚本(通过./foo.js &
)并且在运行时,它开始更改您的工作目录或覆盖您的{{1 }}。那将是一场噩梦。
如果您需要执行一些需要更改shell工作目录的操作,则需要在shell中编写一个函数。例如,如果您正在运行Bash,则可以将其放在PATH
:
~/.bash_profile
然后这很酷的事情是可行的:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
如果你还需要做更复杂的事情,你总是可以从该函数调出你的nodejs脚本。
这是你完成你想要做的事情的唯一方法。
答案 3 :(得分:8)
简短回答:没有(简单?)方式,但你可以做一些符合你目的的事情。
我已经完成了一个类似的工具(一个小命令,给定项目描述,设置环境,路径,目录等)。我所做的就是设置所有内容,然后用:
生成一个shellspawn('bash', ['-i'], {
cwd: new_cwd,
env: new_env,
stdio: 'inherit'
});
执行后,您将使用新目录(在我的情况下,环境中)使用shell。当然,您可以根据自己喜欢的外壳更改bash。与您最初要求的主要区别是:
然而,对我来说,这种差异是可取的。
答案 4 :(得分:0)
试试这个代码:
const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);