10

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

 


 

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

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

问题是它process.chdir()适用于 SCRIPT 目录,而不适用于 SHELL 目录。我需要能够以某种方式通过 bash 调用将当前 shell 传递给节点脚本,并在脚本中更改该 shell 的路径——创建子 shell 不会解决问题。

4

3 回答 3

10

简而言之:你不能。工作目录仅限于进程的上下文(可能还有子进程,但肯定不是父进程)。因此,您的 Node 进程的 cwd 无法传播回您的 shell 进程。

一个常见的技巧是让您的 Node 应用程序将工作目录打印到标准输出,并让您的 shell 像这样运行您的 Node 应用程序:

cd "$(node app)"

一个简单的测试用例:

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

如果你为它创建一个 shell 别名/函数,它应该是相对轻松的。

于 2013-10-24T12:26:06.967 回答
9

为了清楚起见,您不能更改父进程的密码。但是,您可以更改工作目录并在该文件夹中启动 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);
}

此示例取自手册。在这里您可以找到手册

于 2013-10-24T10:48:17.467 回答
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
>
于 2022-01-28T11:41:24.737 回答