node.js - 使用 Node.js 作为 Shell

标签 node.js shell

如何将 node.js 设置为 bash 的 shell 替代品?例如,我应该能够运行 vi('file') 来打开文件并运行 cd('location') 来在目录之间切换。

这可能吗?

最佳答案

当然可以!不过,使用计算机会变得不那么简单。

首先,您需要知道如何进行设置。虽然您可能会将 Linux 中的用户 shell 设置为 usr/bin/node,但这将使您只有一个 Node.js REPL,而无需设置其他程序。您要做的是编写一个设置脚本,它可以为您执行以下所有设置/便利步骤,基本上以 repl.start() 结尾。设置完所有内容后生成 REPL。当然,由于 UNIX shell 设置不能指定参数,您将需要编写一个小的 C 程序来使用这些参数执行您的 shell(本质上,exec("/usr/bin/node", "path/to/setup/script.js");) 并将其设置为您的 UNIX shell。

这里的主要思想是,您使用的任何超出基础知识的命令都必须 require()d 到您的 shell 中 - 例如对你的文件系统做任何事情,执行

var fs = require("fs")

并从 fs 对象执行所有文件系统调用。这类似于向您的 PATH 添加内容。您可以使用 shelljs 获取基本的 shell 命令或类似的,并获得实际的可执行程序,使用 Node 的内置 child_process.spawnSync对于前台任务或 child_process.spawn用于后台任务。

由于您的部分要求是您希望像调用函数一样调用每个程序,因此您需要自己生成这些函数,例如:

function ls(path) {
    child_process.spawnSync('/bin/ls', [path], { stdio: 'inherit' });
}

为你想要运行的一切。您可以通过遍历 PATH 中的所有条目并使用涉及 eval()new Function() 的东西以编程方式为每个条目生成执行函数,并分配它们到全局对象,这样您就不必输入任何前缀。

同样,尽管具有这些命名功能,但使用您的计算机将变得不那么简单。许多在后台欺骗和使用 bash 命令的程序可能不再工作。但我当然可以看到能够在命令行环境中利用 JavaScript 的吸引力。


附录:为了编写这个安装脚本,repl.start() 返回的REPLServer 对象有一个context。与它创建的 REPL session 可访问的全局对象相同的对象。当您编写设置脚本时,您需要将所有内容分配给 context 对象:

const context = repl.start('> ').context;
context.ls = function ls(path) { /* . . . */ }
context.cd = function cd(path) { /* . . . */ }

关于node.js - 使用 Node.js 作为 Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850903/

相关文章:

javascript - 防止 Jasmine 中的 onComplete 退出

node.js - 通过 HTTP 确认 SNS 订阅时出现授权错误

linux - 如何在shell脚本中获取子进程和后代进程的执行时间?

Python Shell 不工作,不运行解释器 (Flask)

linux - 如何使用存在于根目录中的所有目录下的特定文件夹中的 shell 脚本列出所有文件?

node.js - 使用 NodeJS 中的用户对象登录后,将重新生成的 session ID 发送回用户代理

node.js - 循环内的 socket.io 不起作用

node.js - Vagrant、Puppet 和 nodejs 模块 : throwing error on npm module installation

linux - 使用 scp 命令复制文件/文件夹

ruby - Windows,从 Ruby 运行 shell 脚本?