使用Node.js作为Shell

时间:2015-11-22 02:12:20

标签: node.js shell

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

这甚至可能吗?

4 个答案:

答案 0 :(得分:8)

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

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

这里的主要想法是,除了基础知识之外,您使用的任何命令都必须require()进入您的shell - 例如要对文件系统执行任何操作,请执行

var fs = require("fs")

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

由于您的部分要求是要将每个程序称为函数,因此您需要自己生成这些函数,并获得以下内容:

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

您要运行的所有内容。您可以通过迭代PATH中的所有条目并使用涉及eval()new Function()的内容为每个条目生成执行函数,将它们分配给全局对象,以便您不具备编程方式。输入任何前缀。

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

答案 1 :(得分:0)

您可以使用自己的命令引导一个repl会话,然后运行脚本

#!/bin/bash
node  --experimental-repl-await -i -e "$(< scripts/noderc.js)"`

这允许诸如:

> ls()
> run('vi','file.txt')
> await myAsyncFunc()

答案 2 :(得分:-1)

这适用于mac和linux。

require('child_process').spawnSync('vi', ['file.txt'], { stdio: 'inherit' })

答案 3 :(得分:-1)

我认为您正在寻找类似https://youtu.be/rcwcigtOwQ0的东西!

如果是。...是的,可以!

如果愿意,我可以分享我的代码。但是我需要先修复一些错误!

请告诉我

我的.sh函数:

const hey = Object.create(null),
    sh = Object.create(null);;
  
hey.shell = Object.create(null);
hey.shell.run = require('child_process').exec;

sh.help = 'Execute an OS command';
sh.action = (...args) => {
    // repl_ is the replServer
    // the runningExternalProgram property is one way to know if I should 
    //       render the prompt and is not needed. I will create a better
    //        way to do this (action without if/decision)!
    repl_.runningExternalProgram = true;
    hey.shell.run(args.join(' '),
            (...args) => {
                ['error', 'log'].forEach((command, idx) => {
                    if (args[idx]) {
                        console[command](args[idx]);
                    }
                });
                repl_.runningExternalProgram = false;
            });
};

PS:要“ cd”到某个目录,您只需要更改process.cwd(当前工作目录)

PS2:为避免需要为每个OS程序/命令编写.sh,您可以在全局对象上使用Proxy。