Ответ 1
Python. Не шутите.
Языки сценариев - это языки сценариев, и Python является особенно приятным, что многие люди находят очень доступным.
Есть ли что-то похожее на Microsoft Powershell (объектно-ориентированная оболочка, построенная на платформе .NET) для Linux (возможно, построенная на Java, GObject или на свой собственный тип объекта/ничего)?
edit: особенно если он похож на синтаксис bash или powershell или cmd и т.д. (= '' standard '')
Python. Не шутите.
Языки сценариев - это языки сценариев, и Python является особенно приятным, что многие люди находят очень доступным.
Несмотря на то, что этот вопрос довольно старый, я думаю, его стоит упомянуть, что в августе 2016 года Microsoft сделала Powershell open-source и кросс-платформу. Инструкции по установке находятся на github.
Хорошо, я уверен, что вы уже это знаете, но кто-то должен был это сказать.
Perl является самым старым и самым популярным.
Если вам нравятся объекты, вам, вероятно, понравится Ruby. Он имеет сложную объектную систему, вдохновленную Smalltalk.
Python имеет этот классный синтаксис блока-структуры-отступа.
Unix - это золотой рудник для продвинутых скриптовых инструментов...
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();
}
});
}
}
}
Вы должны переосмыслить, почему вы считаете, что вам нужна объектно-ориентированная оболочка. Тем не менее, если вы настроены на попытки странных оболочек, вы не ошибетесь с zoid. В отличие от многих других предложений, которые я вижу здесь, это действительно оболочка. С другой стороны, если вы не знаете или не любите Perl, вы, вероятно, не будете счастливы.
jq - не совсем объектно-ориентированная оболочка, но она предоставляет некоторые преимущества, которые могут иметь объектно-ориентированные оболочки; Я использую его много, вместе со сценариями оболочки, для таких задач.