从 bin 脚本运行时,我试图更改我的 Node.js 脚本的工作目录。我有以下内容:
#!/usr/bin/env node
process.chdir('/Users')
然后当我用 运行这个文件时./bin/nodefile
,它会退出,但当前 shell 上下文的工作目录没有改变。我也尝试过shelljs,但这也不起作用。
做这个的最好方式是什么?我知道它正在工作,但它只是在一个单独的过程中。
从 bin 脚本运行时,我试图更改我的 Node.js 脚本的工作目录。我有以下内容:
#!/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 中也是可测试的:
[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'
Node 没有内置方法来更改运行 Node 进程的底层 shell的 CWD。
您可以通过命令更改Node 进程的当前工作目录process.chdir()
。
var process = require('process');
process.chdir('../');
当 Node 进程存在时,您会发现自己回到了启动该进程的 CWD。
你试图做的事情是不可能的。原因是在 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 脚本。
这是您可以完成您正在尝试做的事情的唯一方法。
简短的回答:不(简单?)方式,但你可以做一些符合你目的的事情。
我做过一个类似的工具(一个小命令,给出项目的描述,设置环境、路径、目录等)。我所做的是设置所有内容,然后生成一个 shell:
spawn('bash', ['-i'], {
cwd: new_cwd,
env: new_env,
stdio: 'inherit'
});
执行后,您将使用新目录(在我的情况下是环境)的外壳。当然,您可以将 bash 更改为您喜欢的任何 shell。与您最初要求的主要区别是:
但是,对我来说,这种差异是可取的。
试试这个代码:
const dirPath = path.join(__dirname, foldername);
process.chdir(dirPath);