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

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

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

当我然后使用./bin/nodefile运行此文件时,它将退出,但当前shell上下文的工作目录未更改。 我也尝试过shelljs,但这也不起作用。

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

4个解决方案
118 votes

更改目录的正确方法实际上是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'
hexacyanide answered 2019-09-09T22:16:36Z
27 votes

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

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

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

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

dthree answered 2019-09-09T22:17:13Z
12 votes

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

当您在命令行上并执行节点脚本时,您当前的进程(~/.bash_profile,PATH,无论如何)会生成一个具有自己环境的新进程,通常是您当前环境的副本(可以通过 系统调用;但这超出了本回复的范围),允许该进程在完全隔离中执行任何需要执行的操作。 当子进程退出时,控制权将交还给shell的进程,在该进程中环境不受影响。

这有很多原因,但是对于一个,想象一下你在后台执行了一个脚本(通过~/.bash_profile),当它运行时,它开始改变你的工作目录或覆盖你的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脚本。

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

Spike Grobstein answered 2019-09-09T22:18:18Z
8 votes

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

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

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

执行之后,你将在一个带有新目录的shell上(在我的例子中,环境)。 当然,您可以根据自己喜欢的外壳更改bash。 与您最初要求的主要区别是:

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

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

Evolopment answered 2019-09-09T22:19:21Z
translate from https://stackoverflow.com:/questions/19803748/change-working-directory-in-my-current-shell-context-when-running-node-script