Y a-t-il des langages qui compilent pour Bash?
J'aime et déteste écrire Bash. J'aime que c'est donc simplifié pour fonctionner sur des fichiers et travailler avec des processus (je suis d'accord avec cette question populaire que c'est bien mieux à cet égard que Python, Ruby, etc.), mais je déteste la syntaxe, en particulier autour des conditionnels, des boucles,etc.
(c'est subjectif, mais je trouve cela à la fois déroutant et ennuyeux. Par exemple $var
lors de la lecture, mais var
lors de l'écriture; les Écritures échouent silencieusement s'il y a des espaces autour =
; les doubles crochets dans ifs lors de l'utilisation de regexp; doubles points-virgules parfois et simples points-virgules autres; etc.)
En tant que grand fan de CoffeeScript, qui compile en JS, je me suis demandé: y a-t-il des langages qui ont l'esthétique/syntaxe de langages comme Python/Ruby/CoffeeScript mais qui compilent et s'exécutent comme Bash au lieu d'un de ces autres runtimes?
Par exemple, j'aimerais pouvoir écrire principalement-Bash avec une syntaxe un peu plus simple:
$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
Ceci est un exemple super artificiel, et la syntaxe est un strawman (principalement inspiré de CoffeeScript mais en gardant les notions essentielles de bash des commandes de première classe, séparées des variables, et du typage lâche).
Quoi Qu'il en soit, juste une question et une matière à réflexion. J'aimerais aimer pouvoir écrire mes scripts dans quelque chose de plus agréable que Bash. = ) Merci!
8 réponses
Vous pouvez également essayer Batsh, qui est un DSL (langage spécifique au domaine ) qui compile un langage de syntaxe C à Bash (et Windows Batch).
Depuis que j'ai initialement posé cette question, deux projets ont été publiés qui attaquent ce problème et font un très bon travail. Les deux réimplémentent beaucoup/la plupart des outils Unix dans des runtimes plus conviviaux pour la programmation.
Plumbum est implémenté en Python et semble assez solide:
Http://plumbum.readthedocs.org/en/latest/index.html
ShellJS est implémenté sur le nœud.js et aussi l'air joli bon:
Https://github.com/arturadib/shelljs
Développements Passionnants! Je suis impatient de les essayer. Si vous avez déjà, ce serait formidable d'entendre vos expériences dans les commentaires. Merci!
Le problème est que toute la sémantique basée sur les chaînes de Bash est si horriblement brisée, il serait assez difficile de faire quelque chose comme CoffeeScript pour Bash.
Puisque vous n'avez probablement pas besoin d'interopérabilité au niveau des fonctions pour appeler des fonctions écrites en Bash, il vaut mieux utiliser quelque chose de complètement différent. Perl est proche de Bash en étant méchant et plein de raccourcis et de syntaxe étrange, mais sa sémantique est principalement sonore. Python est moins confortable pour des choses telles que processus de lancement mais est beaucoup mieux pour la programmation des systèmes généraux, propre et facile à entretenir. Python a d'excellentes bibliothèques et modules pour tout; Perl encore mieux.
Bish est une autre option:
Https://github.com/tdenniston/bish
Script Shell avec une sensation moderne.
Bish est un langage léger créé pour introduire les scripts shell dans le 21ème siècle. Il donne aux programmeurs le confort de la syntaxe moderne mais compile à Bash, ce qui entraîne une bonne portabilité (dans la mesure où Bash est portable).
J'ai essayé tous les ci-dessus (résultats) et a commencé à powscript.
Différences powscript vs les outils ci-dessus,
- préprocesseur extrêmement portable (100% bash)
- soldes entre coffeescript et bash
- compilateur/runtime portable tout-en-un sans tracas, écrit en bash
- transpiler lâche: bash en ligne toujours possible
Vous pouvez essayer ZSh, il a beaucoup d'améliorations pour rendre votre script shell plus lisible.
Vous pouvez jeter un oeil dans nscript, dans lequel vous pouvez écrire des scripts shell en utilisant javascript. Toutes les constructions bash communes sont là, comme les codes de sortie, les tuyaux, les redirections de flux, l'expansion des arguments, le globbing, l'invite, etc.
J'ai récemment développé un langage appelé BashClass, qui est Orientée Objet, a vérification de type et permettre à multi-dimensionnelle tableaux. La syntaxe du langage est inspirée par différents langages de programmation.
Voici un exemple sur la façon dont une classe List
est implémentée (exemple complet ici):
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];
}
}
Les Classes et les tableaux multidimensionnels dans BashClass sont convertis en tableaux associatifs Bash 4.4. La langue est à sa première sortie et est open source sur Github. N'hésitez pas à contirbute et suggérer des fonctionnalités.