Подтвердить что ты не робот

Существуют ли какие-либо языки, скомпилированные с Bash?

Я люблю и ненавижу писать Bash. Мне нравится, что он настолько оптимизирован для работы с файлами и работает с процессами (я согласен с этим популярным вопросом, что он лучше в этом отношении, чем Python, Ruby и т.д.), но я ненавижу синтаксис, особенно вокруг условностей, циклов и т.д.

(Это субъективно, но я нахожу его как запутанным, так и раздражающим. Например, $var при чтении, но var при записи; запись тихо завершается, если есть пробелы вокруг =; двойные скобки в ifs при использовании регулярное выражение, двойные точки с запятой и отдельные точки с запятой и т.д.)

Как огромный поклонник CoffeeScript, который компилируется в JS, мне было интересно: существуют ли какие-либо языки с эстетическим/синтаксисом таких языков, как Python/Ruby/CoffeeScript, но которые компилируются и выполняются как Bash вместо одно из этих других режимов работы?

например. Мне бы очень хотелось писать в основном Bash с чуть более простым синтаксисом:

$AGGREGATE_FILENAME = 'allfiles.txt'

if not exists $AGGREGATE_FILENAME
    touch $AGGREGATE_FILENAME

for $file in files/*
    cat $file >> $AGGREGATE_FILENAME

switch $1
    case 'test'
        run-tests
        echo 'Tests finished!'
    case 'deploy'
        echo 'Packaging...'
        mv foo bar/
        deploy-bar

Это супер надуманный пример, и синтаксис - это соломенный (в основном, вдохновленный CoffeeScript, но содержащий существенные понятия Bash команд первого класса, отделенные от переменных, и свободный ввод текста).

Во всяком случае, просто вопрос и еда для размышлений. Мне бы хотелось, чтобы мои сценарии были написаны чем-то приятнее, чем Bash. =) Спасибо!

4b9b3361

Ответ 1

Поскольку я изначально задал этот вопрос, были выпущены два проекта, которые атакуют эту проблему и выполняют довольно хорошую работу. Оба переопределяют многие/большинство инструментов Unix в более удобных для программирования времени исполнения.

Plumbum реализован в Python и выглядит довольно солидно:

http://plumbum.readthedocs.org/en/latest/index.html

ShellJS реализован на Node.js, а также выглядит довольно хорошо:

https://github.com/arturadib/shelljs

Захватывающие события! Я с нетерпением жду их опробовать. Если у вас уже есть, было бы здорово услышать ваш опыт в комментариях. Спасибо!

Ответ 3

Проблема в том, что вся строковая семантика Bash настолько ужасно нарушена, что было бы довольно сложно сделать что-то вроде CoffeeScript для Bash.

Поскольку вам, вероятно, не нужна функциональная совместимость функций для вызова функций, написанных в Bash, вам лучше использовать что-то совершенно другое. Perl близок к Bash, будучи отвратительным и полным ярлыков и странного синтаксиса, но его семантика в основном звучит. Python менее удобен для таких вещей, как запуск процессов, но намного лучше для общего программирования систем, чистый и простой в обслуживании. Python имеет отличные библиотеки и модули для всего; Perl еще лучше.

Ответ 4

Биш - еще один вариант:

https://github.com/tdenniston/bish

Сценарий оболочки с современным ощущением.

Биш - легкий язык, созданный для создания сценариев оболочки в 21 веке. Это дает программистам удобство современного синтаксиса, но компилируется в Bash, что приводит к хорошей переносимости (до версии Bash).

Ответ 5

Возможно, вы захотите попробовать ZSh, у него есть много улучшений, чтобы сделать вашу оболочку script более читаемой.

http://www.zsh.org

Ответ 6

Я попробовал все вышеперечисленное (результаты) и начал powscript.

Различия powscript по сравнению с инструментами выше

  • чрезвычайно портативный препроцессор (100% bash)
  • балансы между coffeescript и bash
  • hasslefree переносимый компилятор/исполняемый файл all-in-one-file, написанный на bash
  • Свободный транспилер: встроенный bash всегда возможен

Ответ 7

Возможно, вам стоит взглянуть на nscript, в котором вы можете писать сценарии оболочки с помощью javascript. Здесь есть все общие конструкции bash, такие как коды выхода, каналы, перенаправления потоков, расширение аргументов, подталкивание, подсказка и т.д.

Ответ 8

Недавно я разработал язык под названием BashClass, который Объектно-ориентированный, имеет проверку типов и разрешите массивы многомерных. Синтаксис языка вдохновлен разными языками программирования.

Здесь приведен пример того, как реализуется класс List (полный пример здесь):

class List extends Object {
    var Object[] data = new Object[];
    var int size = 0;
    constructor List(){
        super_constructor();
    }

    function void add(var Object object) {
        data[size] = object;
        size = size + 1;
    }

    function void pop() {
        if(size == 0) {
            exception("Cannot remove element from an empty list");
        }
        size = size - 1;
        data[size] = null;
    }

    function int size() {
        return size;
    }

    function Object get(var int index) {
        if(index < 0 || index >= size) {
            exception("Cannot access element out of bound");
        }
        return data[index];
    }
}

Классы и многомерные массивы в BashClass преобразуются в ассоциативные массивы Bash 4.4. Язык находится в первом выпуске и является открытым исходным кодом на Github. Не стесняйтесь контактировать и предлагать функции.