面向对象的linux shell?

面向对象的linux shell?,linux,oop,shell,powershell,Linux,Oop,Shell,Powershell,对于Linux(可能基于Java、GObject或其自身的对象类型/nothing构建),是否有类似于Microsoft Powershell(基于.NET框架构建的面向对象的shell)的功能 编辑:特别是与bash、powershell或cmd等类似时。语法(“‘标准’shell语法)可以做到这一点,事实上,它是下载中包含的示例之一。以交互方式使用它,或者(可能更有用)用JavaScript编写shell脚本 例如: #!/usr/local/bin/node var sys = req

对于Linux(可能基于Java、GObject或其自身的对象类型/nothing构建),是否有类似于Microsoft Powershell(基于.NET框架构建的面向对象的shell)的功能

编辑:特别是与bash、powershell或cmd等类似时。语法(“‘标准’shell语法)

可以做到这一点,事实上,它是下载中包含的示例之一。以交互方式使用它,或者(可能更有用)用JavaScript编写shell脚本

例如:

#!/usr/local/bin/node

var sys  = require('sys'),
    exec = require('child_process').exec;

// Run `ls`:
exec('ls -lh /usr', function(error, output, erroutput) {
    sys.print('output:    ' + output);
    sys.print('erroutput: ' + erroutput);
});
…但这只是一个高级接口,可以为您缓冲所有输出,等等。如果您愿意,您可以得到比这个多得多的内容

NodeJS将异步作为正常状态,因此如果您想要一个“传统”的shell脚本,您可能会发现它不是一个很好的匹配,因为它(据我所知,在本文撰写时)没有提供同步版本的
exec
。因此,一系列特殊的串行语句成为回调中的练习:

exec('first_command', function(error) {
    if (error != null) {
        exec('second_command', function(error) {
            if (error != null) {
                // ....
            }
        });
    }
});
…但当然,您可以创建一个函数来为您处理该问题,并(比如)执行一组顺序语句(然后通过节点的模块系统将其作为模块安装)。例如:

#!/usr/local/bin/node
var sys  = require('sys'),
    exec = require('child_process').exec;

execSeries([
    'ls -ld /usr',
    'foobar',
    'ls -ld /etc'
], {echo: true}, function(results) {
    sys.print("Done\n");
});

// ===> This would be in a module, not in the script itself <===
function execSeries(series, options, callback) {
    var index = 0,
        results = [];

    // Make 'options' optional
    if (!callback && typeof options === "function") {
        callback = options;
        options = undefined;
    }

    // Default options
    options = options || {};

    // Go
    callNext();

    function callNext() {
        if (index >= series.length) {
            // Done
            callback(results);
        }
        else {
            // Call the next one
            exec(series[index++], function(error, stdout, stderr) {
                // Record result
                results.push({error: error, stdout: stdout, stderr: stderr});

                // Echo?
                if (options.echo) {
                    if (error == null) {
                        sys.print(stdout);
                    }
                    else {
                        sys.print("Error: " + error + "\n");
                    }
                }

                // Stop on error?
                if (options.breakOnError && error != null) {
                    // Yes, and there was an error; stop
                    callback(results);
                }
                else {
                    // No, continue
                    callNext();
                }
            });
        }
    }
}
#/usr/local/bin/node
var sys=require('sys'),
exec=要求(“子进程”)。exec;
执行序列([
“ls-ld/usr”,
“foobar”,
“ls-ld/etc”
],{echo:true},函数(结果){
系统打印(“完成”\n);
});
//=>这将在一个模块中,而不是在脚本本身中=series.length){
//完成
回调(结果);
}
否则{
//打电话给下一个
exec(系列[index++],函数(错误,标准输出,标准输出){
//记录结果
push({error:error,stdout:stdout,stderr:stderr});
//回声?
if(options.echo){
如果(错误==null){
系统打印(标准输出);
}
否则{
系统打印(“错误:“+错误+”\n”);
}
}
//错误时停止?
if(options.breakError&&error!=null){
//是的,出现了一个错误;停下来
回调(结果);
}
否则{
//不,继续
callNext();
}
});
}
}
}
Python。别开玩笑了

脚本语言是脚本语言,Python是一种特别好的语言,许多人认为它非常容易理解。

Perl、Python和Ruby
好吧,我相信你已经知道了,但总得有人说出来

Perl是最古老和最流行的

如果你喜欢对象,你可能会喜欢Ruby。它有一个受Smalltalk启发的复杂对象系统

Python通过缩进语法实现了这种很酷的块结构


Unix是高级脚本工具的金矿…

您应该重新思考为什么您认为您需要一个面向对象的shell。这就是说,如果你准备尝试奇怪的贝壳,你不会错的。与我在这里看到的许多其他建议不同,它实际上是一个外壳。另一方面,如果你不知道或不喜欢Perl,你可能不会高兴。

不是一个完全面向对象的shell,但它提供了一些面向对象shell可能具有的好处;我经常将它与shell脚本一起用于此类任务。

尽管这个问题已经很老了,但我认为值得一提的是,2016年8月,微软将Powershell打造成开源和跨平台的。github上有安装说明


我不认为这会有用。@DaVinci:我经常做“touch foo.ext;cvs add foo.ext;$EDITOR foo.ext”,以至于我认为映射操作或jQueryesque语义可能会很有趣。是的,“for op in touch”cvs add“$EDITOR;do$op foo.ext;done”可能会起作用,但打字比手动操作要多。和@Ulrich:
函数的可能重复项{touch“$1”;cvs add“$1”;$EDITOR“$1”}
对您来说还不够吗?如果你真的想按照你描述的方式来做,你当然可以使用eval。你也可以看到,通常的脚本语言并不擅长于shell的设计目的:调用程序、引用文件、用管道连接东西。部分正确,尤其是在提示时。但是,当bash脚本稍微增长时,在查看手册如何处理异常之前,或者在试图记住删除/tmp/中内容的一种真正安全的方法之前,我会在python@ak2操作系统()操作系统包的其余部分使它变得简单,当然可以从Python和其他软件中完成Shell擅长的所有事情,但是它并没有那么方便,特别是在交互使用方面。shell命令的脚本语言等价物通常要详细得多(
os.listdir('.')
any?),如果启用了制表符,制表符完成就不一样了。但我同意Marko的观点,对于更大的脚本,“shell”不是一种令人愉快的编程语言。“Hypershell”?上次更新是两年前吗?听起来很理想。。。。然而,它们中没有一个能很好地替代交互式Unix shell。Perl非常古老。我高度怀疑它在2018年是否比Python更受欢迎。幸好,在你发布这个答案之前,没有人注意到这个问题是离题的:-)酷!谢谢你的更新!这是非常可笑的亵渎,我喜欢它。我试过一次,有人在Linux sdie上使用过它吗?为什么没有?这比将所有输出解析为字符串要好。所有输出都不是字符串,所有输出都是字节流,这是计算的基本原理。您可以简单地在上面创建更高阶的对象,也可以创建工具来交换这些对象,而无需shell的支持。Shell支持并没有使它变得非常容易,这一点从缺少流行的Shell就可以明显看出