Объектно-ориентированная оболочка для linux?

Есть ли что-то похожее на Microsoft Powershell (объектно-ориентированная оболочка, построенная на платформе .NET) для Linux (возможно, построенная на Java, GObject или на свой собственный тип объекта/ничего)?

edit: особенно если он похож на синтаксис bash или powershell или cmd и т.д. (= '' standard '')

Ответы

Ответ 1

Python. Не шутите.

Языки сценариев - это языки сценариев, и Python является особенно приятным, что многие люди находят очень доступным.

Ответ 2

Несмотря на то, что этот вопрос довольно старый, я думаю, его стоит упомянуть, что в августе 2016 года Microsoft сделала Powershell open-source и кросс-платформу. Инструкции по установке находятся на github.

https://github.com/PowerShell/PowerShell

Ответ 3

Perl, Python и Ruby


Хорошо, я уверен, что вы уже это знаете, но кто-то должен был это сказать.

Perl является самым старым и самым популярным.

Если вам нравятся объекты, вам, вероятно, понравится Ruby. Он имеет сложную объектную систему, вдохновленную Smalltalk.

Python имеет этот классный синтаксис блока-структуры-отступа.

Unix - это золотой рудник для продвинутых скриптовых инструментов...

Ответ 5

NodeJS может это сделать, на самом деле это один из образцов, включенных в загрузку. Используйте его в интерактивном режиме или, возможно, более полезно, напишите сценарии оболочки в JavaScript.

Например:

#!/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 воспринимает асинхронность как нормальное состояние дел, и поэтому, если вы хотите "традиционную" оболочку script, вы можете найти ее не очень хорошо, как она есть (на момент написания, насколько я знаю знаете) предлагают синхронную версию exec. Таким образом, специальная серия серийных операторов становится упражнением в обратных вызовах:

exec('first_command', function(error) {
    if (error != null) {
        exec('second_command', function(error) {
            if (error != null) {
                // ....
            }
        });
    }
});

... но, конечно, вы можете создать функцию, которая обрабатывает это для вас, и принимает (скажем) массив последовательных операторов для выполнения (а затем устанавливает его как модуль через модуль sysstem Node). Так, например:

#!/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();
                }
            });
        }
    }
}

Ответ 6

Вы должны переосмыслить, почему вы считаете, что вам нужна объектно-ориентированная оболочка. Тем не менее, если вы настроены на попытки странных оболочек, вы не ошибетесь с zoid. В отличие от многих других предложений, которые я вижу здесь, это действительно оболочка. С другой стороны, если вы не знаете или не любите Perl, вы, вероятно, не будете счастливы.

Ответ 7

jq - не совсем объектно-ориентированная оболочка, но она предоставляет некоторые преимущества, которые могут иметь объектно-ориентированные оболочки; Я использую его много, вместе со сценариями оболочки, для таких задач.