使用Node更改当前目录

13

我正在尝试用node.js编写一个命令行实用程序。作为其中的一个功能,它应该更改调用它的shell的当前工作目录。类似于cd的node.js版本。是否可以实现这一点?如果可以,怎么做?

 


 

为了澄清,我希望能够通过运行脚本来更改终端窗口中的当前目录。

/some/path> ...
/some/path> nodecd /other/path
/other/path> ...

问题在于process.chdir()仅适用于SCRIPT目录,而非SHELL目录。我需要找到一种方法,通过bash执行来将当前的shell传递到node脚本中,并在脚本内更改该shell的路径-创建子shell无法解决这个问题。

3个回答

12

简而言之:你不能这样做。工作目录仅限于进程的上下文环境(可能包括子进程,但绝对不包括父进程)。因此,你的 Node 进程的当前工作目录无法传播回你的 shell 进程。

一个常见的技巧是让你的 Node 应用程序将当前工作目录打印到标准输出,然后让你的 shell 运行你的 Node 应用程序,如下所示:

cd "$(node app)"

一个简单的测试案例:

// app.js
console.log('/tmp');

如果您为此创建一个Shell别名/函数,那么这应该相对轻松。


11
为了明确起见,您无法更改父进程的密码。但是,您可以更改工作目录并在该文件夹中启动一个shell。

您需要使用process.chdir()
console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

这个例子来自手册。在这里你可以找到手册


谢谢,但这并没有解决问题。它仅更改脚本的工作目录,而我需要更改调用脚本的shell的目录。请参见添加的说明。 - Hubert OG
7
不可能。一个孩子无法改变他父亲的环境。 - hek2mgl

0

我正在做类似的事情,我通过让你的Node脚本将原生命令写入文件,然后执行它来实现这一点。

以下示例将随机向上移动一个或两个目录。将这两个文件放在同一个目录中:

index.js

import fs from "fs";

const nativeCommand = Math.random() > 0.5 ? "cd .." : "cd ../..";
console.log(`Executing ${nativeCommand}`);

fs.writeFileSync(`${__dirname}/command`, nativeCommand);

cli-tool.cmd

@echo off
set FILE_PATH=%~p0index.js
node %FILE_PATH% %*

set /p COMMAND=< %~p0\command
%COMMAND%

运行它

C:/users/johndoe/projects/cli-tool
> ./cli-tool.cmd
Executing cd ../..

C:/users/johndoe
>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接