Предисловие: я люблю bash и не собираюсь начинать какие-либо споры или священные войны, и, надеюсь, это не наивный вопрос.
Этот вопрос несколько связан с этим постом о суперпользователе, но я не думаю, что ОП действительно знал, о чем он просил. Я использую bash на FreeBSD, Linux, OS X и Cygwin на Windows. У меня также был большой опыт работы с PowerShell в Windows.
Существует ли оболочка для * nix, уже доступная или находящаяся в разработке, которая совместима с bash, но добавляет в смесь слой объектно-ориентированных сценариев? Единственное, что я знаю об этом, это консоль python, но, насколько я могу судить, она не обеспечивает доступ к стандартной среде оболочки. Например, я не могу просто cd ~
и ls
тогда chmod +x file
внутри консоли python. Я должен был бы использовать Python для выполнения этих задач, а не стандартные двоичные файлы Unix, или вызывать двоичные файлы с использованием кода Python.
Существует ли такая оболочка?
источник
cd ~
следуютls
работы, как в Bash. Вы также можете назначить вывод переменным Python (списки строк ... вроде) с помощью команд вродеlisting = !ls
.Ответы:
Я могу думать о трех желательных особенностях в оболочке:
Оболочки Unix, как правило, концентрируются на интерактивном аспекте и передают большую часть доступа к системе и часть программирования внешним инструментам, таким как:
ftp
для FTPmail
,Mail
,mailx
И т.д. для основной электронной почтыcron
для запланированных задачdbus-*
или qdbus ) для различных системных задач и задач конфигурации (включая современные настольные среды, такие как KDE ≥4)Много-много чего можно сделать, вызвав команду с правильными аргументами или по конвейеру. Это очень мощный подход - лучше иметь один инструмент на задачу, который делает это хорошо, чем одну программу, которая делает все, но плохо - но у нее есть свои ограничения.
Основное ограничение оболочек Unix, и я подозреваю, что это то, что вам нужно с вашим требованием «объектно-ориентированных сценариев», заключается в том, что они не способны сохранять информацию от одной команды к другой или комбинировать команды более изящными способами, чем трубопровод. В частности, межпрограммное взаимодействие основано на тексте, поэтому приложения можно объединять, только если они сериализуют свои данные совместимым способом. Это и благословение, и проклятие: подход «все в тексте» облегчает быстрое выполнение простых задач, но создает барьер для более сложных задач.
Интерактивное удобство использования также противоречит удобству сопровождения программы. Интерактивные программы должны быть короткими, требовать небольшого количества кавычек, не беспокоить вас объявлениями переменных или вводить текст и т. Д. Поддерживаемые программы должны быть читаемыми (поэтому не иметь много сокращений), должны быть читаемыми (чтобы вам не приходилось задумываться, является ли слово голым) является строкой, именем функции, именем переменной и т. д.), должны иметь проверки непротиворечивости, такие как объявления переменных и типирование и т. д.
Таким образом, оболочка является сложным компромиссом. Хорошо, на этом заканчивается раздел rant, на примерах.
Perl Shell (PSH) «сочетает в себе интерактивную природу Unix оболочки с силой Perl». Простые команды (даже конвейеры) могут быть введены в синтаксисе оболочки; все остальное - Perl. Проект давно не разрабатывался. Он пригоден для использования, но еще не дошел до того, что я бы подумал об использовании его поверх чистого Perl (для сценариев) или чистой оболочки (в интерактивном режиме или для сценариев).
IPython - это улучшенная интерактивная консоль Python, особенно ориентированная на численные и параллельные вычисления. Это относительно молодой проект.
irb (интерактивный ruby) - это Ruby-эквивалент консоли Python.
scsh - это реализация схемы (т. е. приличный язык программирования) с типом системных привязок, традиционно встречающихся в оболочках Unix (строки, процессы, файлы). Однако он не предназначен для использования в качестве интерактивной оболочки.
Zsh - улучшенная интерактивная оболочка. Его сильной стороной является интерактивность (редактирование командной строки, завершение, общие задачи, выполненные с кратким, но загадочным синтаксисом). Его функции программирования не так уж хороши (наравне с ksh), но он поставляется с рядом библиотек для управления терминалами, регулярных выражений, работы в сети и т. Д.
рыба - чистое начало в оболочке в стиле Unix. Он не имеет лучшего программирования или функций доступа к системе. Поскольку он нарушает совместимость с sh, у него больше возможностей для развития улучшенных функций, но этого не произошло.
Приложение: другая часть инструментария Unix рассматривает многие вещи как файлы:
/sys
предоставляет больше аппаратного и системного контроля./proc
файловую систему.Возможно, будущее оболочек Unix не в улучшении доступа к системе через команды (и в улучшенных структурах управления для объединения команд), а в улучшении доступа к системе через файловые системы (которые объединяются несколько по-другому - я не думаю, что мы определили, какие ключевые идиомы (например, оболочка трубы) еще есть).
источник
Вам не нужно много кода bash для реализации классов или объектов в bash.
Скажем, 100 строк.
Bash имеет ассоциативные массивы, которые можно использовать для реализации простой системы объектов с наследованием, методами и свойствами.
Итак, вы могли бы определить класс следующим образом:
Создание экземпляра этой очереди может быть сделано следующим образом:
или
Так как классы реализованы с массивом, класс и экземпляр на самом деле являются синонимами - как в javascript.
Добавление элементов в эту очередь может быть сделано так:
Удаление элементов в переменную X может быть сделано следующим образом:
И выгрузка структуры объекта может быть сделана так:
Что бы вернуть что-то вроде этого:
Классы создаются с использованием функции класса следующим образом:
ПРИМЕЧАНИЕ. При определении нового класса или экземпляра вы можете переопределить любое значение или функцию члена.
Ассоциативные массивы Bash имеют причуду, которая делает эту работу аккуратно: $ Q [0]} идентичен $ Q. Это означает, что мы можем использовать имя массива для вызова функции диспетчеризации метода:
Недостатком является то, что я не могу использовать [0] для данных, поэтому мои очереди (в данном случае) начинаются с index = 1. В качестве альтернативы я мог бы использовать ассоциативные индексы, такие как «q + 0».
Чтобы получить и установить участников, вы можете сделать что-то вроде этого:
И свалить структуру объекта, я сделал это:
ПРИМЕЧАНИЕ. Это не требуется для ООП в bash, но приятно видеть, как создаются объекты.
Мой дизайн ООП не рассматривал объекты внутри объектов - за исключением унаследованного класса. Вы можете создать их отдельно или создать специальный конструктор, такой как class (). * obj_dump * необходимо изменить, чтобы обнаружить внутренние классы для их рекурсивной печати.
Ой! и я вручную определяю класс ROOT, чтобы упростить функцию класса :
С помощью нескольких функций очереди я определил несколько классов следующим образом:
Создал несколько экземпляров Queue и заставил их работать:
источник
bash
, для чего. Напоминает мне ответ Стефана о том, почему бы не использовать циклы оболочки для обработки текста, особенно раздел, озаглавленный «концептуально», который детализирует различие в целях между языками, такими как C иbash
. unix.stackexchange.com/a/169765/135943ksh93t + вводит некоторые концепции ОО, сохраняя синтаксис оболочки bourne / posix: http://blog.fpmurphy.com/2010/05/ksh93-using-types-to-create-object-orientated-scripts.html
источник
IPython удивительно удобен в использовании.
Стандартные функции оболочки: управление заданиями, редактирование и история readline, псевдонимы
cat
ls
cd
иpwd
интеграция с пейджером, запуск любой системной команды путем добавления к ней префикса!
или включения%rehashx
, вывод команды, назначаемый переменной python, значения python, доступные как переменные оболочки.Специфично для Python: повторное использование результатов последних команд, быстрый доступ к документации и исходным кодам, перезагрузка модуля, отладчик. Некоторая поддержка кластера, если вы в этом.
Тем не менее, запуск сложных каналов не выполняется в Python; вы также будете использовать оболочку posix, просто с небольшим количеством клея для передачи значений туда и сюда.
источник
Есть Rush, который использует ruby и Psh, основанный на perl.
источник
jq
работает довольно хорошо, как такой вид объектно-ориентированного слоя.источник
Этот немного проще в использовании и настройке, имеет именованные аргументы и т. Д. Https://github.com/uudruid74/bashTheObjects
Я обновляю свой ответ примером, который следует за одним из основных примеров, приведенных для другого ответа, но с этим синтаксисом. Программа-пример похожа, но вам не нужно ставить перед всеми переменными префикс имени класса (он знает это, как показывает метод kindof ), и я думаю, что синтаксис очень проще!
Во-первых, файл класса. Значения по умолчанию для переменных экземпляра являются необязательными и используются только в том случае, если вы не передаете эти значения в конструктор.
Теперь, например, использование:
ЗАМЕТКИ:
Оператор импорта технически не требуется, но он вызывает загрузку класса в заданной точке вместо ожидания первого нового , что может помочь инициализировать вещи в правильном порядке. Обратите внимание на легкость, с которой вы можете устанавливать несколько переменных экземпляра одновременно.
Существуют также уровни отладки, конструкторы, деструкторы, подклассы и базовая система отражений , и показано как print / println заменяет эхо (когда-нибудь пытаетесь напечатать переменную, которая начинается с тире?). Пример на github показывает, что он работает как CGI, генерирующий HTML из классов.
Сама библиотека (oop.lib.sh) не так проста (400+ строк, 11K), но вы просто включаете ее и забываете.
источник
Теперь вы можете установить PowerShell Core Edition на Linux. Он работает на кроссплатформенной платформе .NET Core, которая активно разрабатывается Microsoft.
источник
Если кто-то хочет получить только основы объектно-ориентированного программирования (свойства и методы), тогда действительно простая структура поможет.
Допустим, вы хотите отобразить текст «Hello World», используя объекты. Сначала вы создаете класс объекта, который имеет свойство для отображения текста и имеет несколько методов для установки этого текста и его отображения. Чтобы показать, как несколько экземпляров класса могут работать вместе, я добавил два метода для отображения текста: один с NewLine в конце и один без этого.
Файл определения класса: EchoClass.class
Обратите внимание на слово «<<имя-экземпляра>>». Это будет заменено позже, чтобы создать несколько экземпляров объекта класса. Прежде чем вы сможете использовать экземпляр объекта, вам нужна функция, которая фактически его создает. Для простоты это будет отдельный скрипт с именем: ObjectFramework.lib
Итак, теперь у нас есть файл определения класса и функция CreateObject, которая создает копию этого файла с текстом «<<InstanceName>>», замененным на любое имя, которое мы хотим.
Давайте использовать наш новый объект в скрипте с именем: HelloWorld.sh (обратите внимание, что HelloWorld.sh должен быть исполняемым. Другие два файла не нужны)
При запуске сценария HelloWorld.sh он отображает текст «Hello World» (и добавляет NewLine). Никто не будет впечатлен этим результатом, однако мы будем знать, что это не так просто, как кажется :)
Удачного кодирования!
источник
Это объектно-ориентированная оболочка, основанная на Python, но с синтаксическим закрытием Golang: https://github.com/alexst07/shell-plus-plus
Например, попробуйте catch:
перегрузка класса и оператора:
и вы можете использовать команды, аналогичные Bash:
источник
Теперь, с какими объектами вы имеете дело в оболочке большую часть времени? Это файлы / каталоги, процессы и их взаимодействие. Так должно нравиться
f1.edit
или как-то такcurrentFile=f1.c ; .edit ; .compile ; .run
. Илиd1.search(filename='*.c' string='int \*')
. Илиp1.stop
,p1.bg
. Это мое понимание ooshell.источник
только что попробовал ввести ооо понятия в bash на основе ссылки http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
источник
Извините за короткий ответ, но здесь идет.
hipersayanx создал статью « Объектно-ориентированное программирование на Bash» . В основном он привет украдена
$FUNCNAME
,function
,compgen
, иexport
создать как можно ближе к ООП можно получить в Баш.Крутая часть - это работает хорошо, и для построения класса нужно всего несколько линий.
Основные необходимые детали:
Использование:
Теперь я сам использовал это в своем проекте AuditOps, и у hipersayanx есть дополнительная информация о том, как это на самом деле работает на его сайте. Предупреждение о тарифе, хотя это очень bashism, не будет работать с чем-то более старым, чем bash 4.0 и может привести к головной боли при отладке. Хотя лично мне бы хотелось, чтобы большая часть обшивки котла переделывалась как сама класс.
Всегда лучше использовать серьезный язык сценариев ООП, такой как perl, ruby и python, когда он лучше подходит для вашего проекта. Однако, по моему честному варианту, при поддержке модульных сценариев bash стоит потратить время и силы на использование этого метода ООП в bash.
источник
Я разрабатываю на GitHub функцию, которая работает так же, как HashMap Object , shell_map .
Для того, чтобы создать экземпляров HashMap » эта функция может создавать свои копии под разными именами. Каждая новая копия функции будет иметь свою переменную $ FUNCNAME. Затем $ FUNCNAME используется для создания пространства имен для каждого экземпляра карты.
Ключи карты являются глобальными переменными в форме $ FUNCNAME_DATA_ $ KEY, где $ KEY - это ключ, добавленный к карте. Эти переменные являются динамическими переменными .
Ниже я приведу упрощенную версию, чтобы вы могли использовать ее в качестве примера.
Использование:
источник
carp "Some error message"; return
вместо этого.[ -z "$KEY" ] && { carp "some message"; return;}
нет необходимости в подоболочке. Но на самом деле это выглядит как реальный кандидат наif ... elif ... elif ... else ... fi
конструкцию - что не всегда лучший выбор, но, вероятно, здесь. :) (Или, может быть, случай переключения.)Plumbum - это Python-подобный язык оболочки. Он упаковывает оболочку как синтаксис с Python, делая опыт объектно-ориентированным.
источник