我如何将node.js设置为bash的shell替换?例如,我应该能够运行vi('file')
来打开文件,并cd('location')
来更改目录。
这甚至可能吗?
答案 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。