Préface: J'adore Bash et n'ai aucune intention de déclencher une quelconque dispute ou une guerre sainte. J'espère que ce n'est pas une question extrêmement naïve.
Cette question est un peu liée à ce post sur le superutilisateur, mais je ne pense pas que l’opérateur savait vraiment ce qu’il demandait. J'utilise bash sous FreeBSD, Linux, OS X et cygwin sous Windows. J'ai également récemment eu une vaste expérience avec PowerShell sous Windows.
Existe-t-il un shell pour * nix, déjà disponible ou en préparation, compatible avec bash mais ajoutant une couche de script orienté objet dans le mélange? La seule chose que je sache qui se rapproche est la console python, mais pour autant que je sache, elle ne donne pas accès à l'environnement shell standard. Par exemple, je ne peux pas simplement cd ~
et ls
ensuite chmod +x file
dans la console Python. Je devrais utiliser python pour effectuer ces tâches plutôt que les fichiers binaires Unix standard, ou appeler les fichiers binaires à l'aide du code python.
Une telle coquille existe-t-elle?
la source
cd ~
suivi dels
fonctionne comme dans Bash. Vous pouvez également affecter une sortie aux variables Python (listes de ligneslisting = !ls
.Réponses:
Je peux penser à trois caractéristiques souhaitables dans un shell:
Les shells Unix ont tendance à se concentrer sur l'aspect interactif et à sous-traiter la plupart des accès au système et une partie de la programmation à des outils externes, tels que:
ftp
pour FTPmail
,Mail
,mailx
, Etc. pour le courrier électronique de basecron
pour les tâches planifiéesdbus-*
ou qdbus ) pour diverses informations système et tâches de configuration (y compris les environnements de bureau modernes tels que KDE ≥4)Beaucoup, beaucoup de choses peuvent être faites en appelant une commande avec les bons arguments ou une entrée canalisée. C'est une approche très puissante - mieux vaut avoir un outil par tâche qui le fait bien, qu'un seul programme qui fait tout sauf le mal - mais il a ses limites.
Une limitation majeure des shells Unix, et je suppose que c’est ce que vous voulez faire avec votre exigence de «script orienté objet», est qu’ils ne sont pas capables de conserver les informations d’une commande à l’autre, ni de les combiner de manière plus sophistiquée qu’elle ne le ferait. un pipeline. En particulier, la communication entre programmes étant basée sur du texte, les applications ne peuvent être combinées que si elles sérialisent leurs données de manière compatible. C’est à la fois une bénédiction et une malédiction: l’approche «tout ce qui est texte» permet d’accomplir rapidement des tâches simples, mais soulève la barrière des tâches plus complexes.
La facilité d'utilisation interactive va également plutôt à l'encontre de la maintenabilité du programme. Les programmes interactifs doivent être courts, demander peu de guillemets, ne pas vous gêner par des déclarations de variables ou des dactylographes, etc. est une chaîne, un nom de fonction, un nom de variable, etc.), doit avoir des contrôles de cohérence tels que les déclarations de variables et le typage, etc.
En résumé, un shell est un compromis difficile à atteindre. Ok, cela termine la section sur les exemples.
Le shell Perl (psh) «combine la nature interactive d’un shell Unix avec la puissance de Perl». Des commandes simples (même des pipelines) peuvent être entrées dans la syntaxe du shell; tout le reste est Perl. Le projet n'a pas été en développement depuis longtemps. C'est utilisable, mais je n'ai pas encore envisagé de l'utiliser au-dessus de pur Perl (pour les scripts) ou pur shell (de manière interactive ou pour les scripts).
IPython est une console Python interactive améliorée, particulièrement destinée à l'informatique numérique et parallèle. C'est un projet relativement jeune.
irb (interactive ruby) est l'équivalent Ruby de la console Python.
scsh est une implémentation de schéma (c'est-à-dire un langage de programmation décent) avec le type de liaisons système que l'on trouve traditionnellement dans les shells Unix (chaînes, processus, fichiers). Il ne vise toutefois pas à être utilisable en tant que shell interactif.
zsh est un shell interactif amélioré. Son point fort est l’interactivité (édition en ligne de commande, exécution, tâches courantes accomplies avec une syntaxe concise mais cryptique). Ses fonctionnalités de programmation ne sont pas très bonnes (à égalité avec ksh), mais il est livré avec un certain nombre de bibliothèques pour le contrôle de terminal, les expressions rationnelles, les réseaux, etc.
le poisson est un début propre à une coquille de style unix. Il n'a pas de meilleures fonctionnalités de programmation ou d'accès au système. Parce qu'il supprime la compatibilité avec sh, il offre davantage de possibilités pour développer de meilleures fonctionnalités, mais cela ne s'est pas produit.
Addendum: une autre partie de la boîte à outils unix traite beaucoup de choses comme des fichiers:
/sys
fournit plus de contrôle du matériel et du système./proc
système de fichiers.Peut-être que l'avenir des shells Unix ne sera pas un meilleur accès au système via des commandes (et de meilleures structures de contrôle pour combiner des commandes), mais un meilleur accès au système via des systèmes de fichiers (qui se combinent de manière légèrement différente - le shell pipe) sont encore).
la source
Vous n'avez pas besoin de beaucoup de code bash pour implémenter des classes ou des objets dans bash.
Dis, 100 lignes.
Bash a des tableaux associatifs qui peuvent être utilisés pour implémenter un système Object simple avec héritage, méthodes et propriétés.
Donc, vous pourriez définir une classe comme celle-ci:
La création d'une instance de cette file d'attente pourrait se faire comme suit:
ou
Comme les classes sont implémentées avec un tableau, class et inst sont vraiment synonymes - un peu comme en javascript.
L'ajout d'éléments dans cette file d'attente pourrait se faire comme suit:
Supprimer des éléments dans une variable X pourrait se faire comme ceci:
Et la structure de déchargement d'un objet pourrait être faite comme ceci:
Ce qui retournerait quelque chose comme ceci:
Les classes sont créées en utilisant une fonction de classe comme ceci:
REMARQUE: lors de la définition d'une nouvelle classe ou instance, vous pouvez remplacer toute valeur ou fonction de membre.
Les tableaux associatifs Bash ont une bizarrerie qui rend ce travail parfaitement ordonné: $ Q [0]} est identique à $ Q. Cela signifie que nous pouvons utiliser le nom du tableau pour appeler une fonction d'envoi de méthode:
Un inconvénient est que je ne peux pas utiliser [0] pour les données, donc mes files d'attente (dans ce cas) commencent à index = 1. Sinon, j'aurais pu utiliser des indices associatifs tels que "q + 0".
Pour obtenir et définir des membres, vous pouvez faire quelque chose comme ceci:
Et pour vider une structure d'objet, j'ai fait ceci:
NOTE: Ceci n'est pas nécessaire pour la programmation orientée objet dans bash, mais il est agréable de voir comment les objets sont créés.
Ma conception POO n'a pas pris en compte les objets à l'intérieur des objets, à l'exception de la classe héritée. Vous pouvez les créer séparément ou créer un constructeur spécial tel que class (). * obj_dump * devrait être modifié pour détecter les classes internes afin de les imprimer de manière récursive.
Oh! et je définis manuellement une classe ROOT pour simplifier la fonction de la classe :
Avec quelques fonctions de file d’attente, j'ai défini des classes comme celle-ci:
Créé des instances de file d'attente et les a fait fonctionner:
la source
bash
est pour. Cela me rappelle la réponse de Stéphane à propos de pourquoi ne pas utiliser des boucles de shell pour traiter du texte, en particulier la section intitulée "conceptuellement" qui détaille la différence de finalité entre les langages tels que C etbash
. unix.stackexchange.com/a/169765/135943ksh93t + introduit quelques concepts OO tout en conservant la syntaxe du shell bourne / posix: http://blog.fpmurphy.com/2010/05/ksh93-using-types-to-create-object-orientated-scripts.html
la source
IPython est étonnamment pratique à utiliser.
Fonctionnalités standard du shell: contrôle des travaux, édition et historique de readline, alias
cat
ls
cd
etpwd
intégration du pager, exécution de toute commande système en la préfixant avec une sortie!
ou en activant la%rehashx
sortie assignable à une variable python, valeurs python disponibles en tant que variables shell.Spécifique à Python: réutilisation des résultats des dernières commandes, accès rapide à la documentation et aux sources, rechargement du module, débogueur. Un certain soutien de cluster si vous êtes dans cela.
Cela dit, faire fonctionner des pipes complexes ne se fait pas en Python; vous utiliserez également le shell posix, juste avec de la colle pour transmettre des valeurs.
la source
Il y a Rush qui utilise ruby et Psh qui est basé sur perl.
la source
jq
fonctionne assez bien comme une telle sorte de couche orientée objet.la source
Celui-ci est un peu plus simple à utiliser et à configurer, a nommé args, etc. https://github.com/uudruid74/bashTheObjects
Je mets à jour ma réponse avec un exemple, qui suit l'un des exemples de base donnés pour une autre réponse, mais avec cette syntaxe. Le programme d'exemple est similaire, mais vous n'avez pas besoin de préfixer toutes les variables avec le nom de classe (il le sait comme le montre la méthode kindof ) et je pense que la syntaxe est beaucoup plus simple!
Tout d'abord, un fichier de classe. Les valeurs par défaut des variables d'instance sont facultatives et ne sont utilisées que si vous ne transmettez pas ces valeurs au constructeur.
Maintenant, par exemple l'utilisation:
REMARQUES:
L'instruction d'importation n'est pas requise techniquement, mais elle force le chargement de la classe à un point donné au lieu d'attendre la première nouvelle , ce qui peut aider à initialiser les éléments dans le bon ordre. Notez la facilité avec laquelle vous pouvez définir plusieurs variables d'instance en même temps.
Il existe également des niveaux de débogage, des constructeurs, des destructeurs, des sous - classes et un système de réflexion de base . L'option print / println remplacera echo (essayez-vous d'imprimer une variable commençant par un tiret?). L'exemple sur github montre qu'il s'exécute en tant que CGI générant du HTML à partir de classes.
La bibliothèque elle-même (oop.lib.sh) n’est pas si simple (plus de 400 lignes, 11K), mais vous devez l’inclure et l’oublier.
la source
Vous pouvez maintenant installer PowerShell Core Edition sur Linux. Il fonctionne sur le framework .NET Core multiplate-forme en cours de développement par Microsoft.
la source
Si quelqu'un ne souhaite que les bases de la programmation orientée objet (propriétés et méthodes), un simple framework suffirait.
Supposons que vous souhaitiez afficher le texte "Hello World" à l'aide d'objets. Tout d'abord, vous créez une classe d'objet qui a une propriété pour le texte à afficher et des méthodes pour définir ce texte et l'afficher. Pour montrer comment plusieurs instances d'une classe peuvent fonctionner ensemble, j'ai ajouté deux méthodes pour afficher le texte: une avec NewLine à la fin et l'autre sans cela.
Fichier de définition de classe: EchoClass.class
Veuillez noter le mot "<<InstanceName>>". Ceci sera remplacé plus tard pour créer plusieurs instances d'un objet de classe. Avant de pouvoir utiliser une instance d'objet, vous avez besoin d'une fonction qui le crée réellement. Pour que les choses restent simples, il s'agira d'un script séparé appelé: ObjectFramework.lib
Nous avons maintenant un fichier de définition de classe et une fonction CreateObject qui crée une copie de ce fichier avec le texte "<<NomInstance>>" remplacé par le nom de votre choix.
Utilisons notre nouvel objet dans un script appelé: HelloWorld.sh (veuillez noter que HelloWorld.sh doit être exécutable. Les deux autres fichiers ne sont pas nécessaires).
En exécutant le script HelloWorld.sh, il affiche le texte "Hello World" (et ajoute une NewLine). Personne ne sera impressionné par ce résultat, mais nous saurons que ce n’est pas aussi simple que ça en a l'air :)
Bonne codage!
la source
Il s’agit d’un shell orienté objet basé sur Python, mais dont la taille est proche de Golang: https://github.com/alexst07/shell-plus-plus
Par exemple, essayez catch:
surcharge de classe et d'opérateur:
et vous pouvez utiliser les commandes similaires bash:
la source
Maintenant, avec quels objets traitez-vous dans un shell la plupart du temps? Ce sont des fichiers / répertoires, des processus et leurs interactions. Donc, il devrait aimer
f1.edit
ou quelque chose commecurrentFile=f1.c ; .edit ; .compile ; .run
. Oud1.search(filename='*.c' string='int \*')
. Oup1.stop
,p1.bg
. C'est ma compréhension d'un ooshell.la source
je viens d'essayer d'introduire des concepts oo à bash basés sur la référence http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
la source
Désolé pour la réponse courte, mais voilà.
hipersayanx a créé un article sur la programmation orientée objet dans Bash . Au fond , il salut-Jacked
$FUNCNAME
,function
,compgen
etexport
de créer aussi près de POO on peut obtenir en bash.La partie cool est que cela fonctionne bien et il suffit de quelques lignes de passe-partout pour construire une classe.
Les pièces de base nécessaires sont:
Usage:
Maintenant, je l'ai moi-même utilisé dans mon projet AuditOps et hipersayanx a plus de détails sur la façon dont cela fonctionne réellement sur son site. L'avertissement de tarif, bien qu'il s'agisse d'un basisme, ne fonctionnera avec aucune version antérieure à bash 4.0 et peut entraîner des maux de tête lors du débogage. Personnellement, j'aimerais voir la plupart des plaques de chaudière refaites en tant que classe.
Il est toujours plus sage d'utiliser un langage de script POO sérieux, tel que perl, ruby et python, lorsqu'il convient mieux à votre projet. Cependant, dans mon honnête option, il vaut la peine de consacrer du temps et des efforts à la maintenance de scripts bash modulaires pour utiliser cette méthode de POO en bash.
la source
Je développe sur GitHub une fonction qui fonctionne comme un objet HashMap , shell_map .
Afin de créer des " instances HashMap ", cette fonction peut créer des copies de lui-même sous différents noms. Chaque nouvelle copie de fonction aura une variable différente $ FUNCNAME. $ FUNCNAME est ensuite utilisé pour créer un espace de noms pour chaque instance de Map.
Les clés de la carte sont des variables globales, sous la forme $ FUNCNAME_DATA_ $ KEY, où $ KEY est la clé ajoutée à la carte. Ces variables sont des variables dynamiques .
Ci-dessous, je vais en mettre une version simplifiée pour que vous puissiez vous en servir comme exemple.
Usage:
la source
carp "Some error message"; return
place.[ -z "$KEY" ] && { carp "some message"; return;}
pas besoin d'un sous-shell. Mais en réalité, cela ressemble à un candidat réel pour uneif ... elif ... elif ... else ... fi
construction - ce qui n'est pas souvent le meilleur choix, mais l'est probablement. :) (Ou peut-être un changement de cas.)Plumbum est un langage shell semblable à Python. Il empaquette shell comme syntaxe avec Python rendant l'expérience orientée objet.
la source