Существуют ли какие-либо языки, скомпилированные с 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. =) Спасибо!
Ответы
Ответ 1
Поскольку я изначально задал этот вопрос, были выпущены два проекта, которые атакуют эту проблему и выполняют довольно хорошую работу. Оба переопределяют многие/большинство инструментов Unix в более удобных для программирования времени исполнения.
Plumbum реализован в Python и выглядит довольно солидно:
http://plumbum.readthedocs.org/en/latest/index.html
ShellJS реализован на Node.js, а также выглядит довольно хорошо:
https://github.com/arturadib/shelljs
Захватывающие события! Я с нетерпением жду их опробовать. Если у вас уже есть, было бы здорово услышать ваш опыт в комментариях. Спасибо!
Ответ 2
Вы также можете попробовать Batsh, который является DSL (Язык, специфичный для домена), который компилирует язык синтаксиса C на Bash (и пакет Windows).
Ответ 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. Не стесняйтесь контактировать и предлагать функции.