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

时间:2013-11-06 03:50:04

标签: javascript node.js terminal command-line-interface cd

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

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

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

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

5 个答案:

答案 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。

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

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

当Node过程存在时,您会发现自己回到了开始该过程的CWD中。

答案 2 :(得分:12)

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

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

这有很多原因,但是对于其中一个,假设您在后台执行了一个脚本(通过./foo.js &)并且在运行时,它开始更改您的工作目录或覆盖您的{{1 }}。那将是一场噩梦。

如果您需要执行一些需要更改shell工作目录的操作,则需要在shell中编写一个函数。例如,如果您正在运行Bash,则可以将其放在PATH

~/.bash_profile

然后这很酷的事情是可行的:

do_cool_thing() {
  cd "/Users"
  echo "Hey, I'm in $PWD"
}

如果你还需要做更复杂的事情,你总是可以从该函数调出你的nodejs脚本。

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

答案 3 :(得分:8)

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

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

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

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

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

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

答案 4 :(得分:0)

试试这个代码:

const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);