137

从 bin 脚本运行时,我试图更改我的 Node.js 脚本的工作目录。我有以下内容:

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

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

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

4

5 回答 5

166

更改目录的正确方法实际上是使用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'
于 2013-11-06T03:52:50.240 回答
36

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

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

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

当 Node 进程存在时,您会发现自己回到了启动该进程的 CWD。

于 2015-09-30T16:35:32.077 回答
18

你试图做的事情是不可能的。原因是在 POSIX 系统(Linux、OSX 等)中,子进程无法修改父进程的环境。这包括修改父进程的工作目录和环境变量。

当您在命令行上并执行 Node 脚本时,您当前的进程(bash,zsh等)会生成一个具有自己环境的新进程,通常是当前环境的副本(可以通过系统调用来更改它) ; 但这超出了本回复的范围),允许该进程在完全隔离的情况下执行它需要执行的任何操作。当子进程退出时,控制权将交还给环境未受影响的 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 脚本。

这是您可以完成您正在尝试做的事情的唯一方法。

于 2016-06-03T22:30:12.300 回答
11

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

我做过一个类似的工具(一个小命令,给出项目的描述,设置环境、路径、目录等)。我所做的是设置所有内容,然后生成一个 shell:

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

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

  • 有一个额外的过程,所以......
  • 你必须写'exit'才能回来,然后......
  • 存在后,所有更改都将撤消。

但是,对我来说,这种差异是可取的。

于 2016-01-06T13:44:09.840 回答
1

试试这个代码:

const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);
于 2021-07-20T07:48:12.170 回答