Interpréteur de commandes

Message 1, par Elzen

§ Posté le 21/08/2014 à 22h 12m 34

Lorsqu'il y a besoin de lancer rapidement une application définie par l'utilisateur (par un menu système ou par le lanceur, par exemple), j'ai fais simple et fonctionnel en confiant cette commande au shell système, avec l'instruction de lancer la commande séparément histoire de ne pas laisser des tonnes de shell tourner pour rien.


Pour les différents terminaux, cependant, la chose était plus délicate, dans la mesure où les deux ne pourraient pas être séparés. Si j'appliquais la même technique, chaque fois que vous ouvrez un terminal, plutôt que de faire tourner bash directement, il ferait tourner un shell faisant lui-même tourner bash, ce qui n'est pas franchement le plus intéressant (remplacez bash par l'interpréteur de commande de votre choix, hein, c'est pour l'exemple).


J'ai donc pris le temps de bricoler un semblant d'interprêteur de commandes permettant, sans faire tourner de processus supplémentaires, de lancer directement les instructions que vous demandez. Bien sûr, je n'ai pas réimplémenté un shell complet intégré à Touhy, aussi cet interprêteur « maison » est-il un peu limité. Néanmoins, j'ai pris soin d'implémenter quand même quelques trucs utiles.


Vous rencontrez cet interprêteur à peu près à chaque fois que vous croisez des terminaux dans Touhy (dans ElzTerm, bien sûr, qui est en cours de réécriture et arrivera, j'espère, prochainement, ; mais également dans les boutons d'outils de la barre d'onglet, comme sur cette capture, et dans les panneaux latéraux de certaines applications). Donc, autant que je vous explique un peu ce que vous pouvez en faire.


L'interpréteur de commande permet, de base, de séparer les différents arguments passés à une commande, en reconnaissant les différents guillemets et antislashs permettant de générer un argument contenant des espaces.

La récupération du texte renvoyé par des sous-commandes (« $(comme ceci) » ou « `comme cela` ») est également pris en compte, de même que l'interprétation des calculs (« $((1 + 1)) ») ; ainsi que l'utilisation du contenu d'une variable (avec « $nom » ou « ${nom} »).

En revanche, les mécanismes permettant de récupérer les noms de fichiers, par exemple avec les caractères « * » et « ? », ne sont pas pris en compte.


Les variables reconnues sont les variables d'environnement connues par Touhy au moment du lancement. Il n'est pas possible d'en définir en cours de route sur plusieurs lignes ; mais la syntaxe « VARIABLE=VALEUR commande » peut être utilisée pour ajouter ou modifier une variable d'environnement pour la commande concernée.

Les redirections des entrée, sortie et sortie d'erreur standards ne sont (pour l'instant ?) pas prises en compte, ni vers des fichiers, ni par un pipe.


Plusieurs commandes peuvent se succéder, auquel cas elles seront lancées successivement. Le séparateur « ; » permet de lancer deux commandes l'une après l'autre, quel que soit le code de retour de la première ; tandis que le séparateur « && » ne lance les commandes suivantes que si la précédente a renvoyé un code 0 (correspondant, sur les systèmes POSIX, à un succès).

Il est également possible d'utiliser l'éperluette simple (« & ») comme séparateur, auquel cas la commande correspondante est lancée séparément, et la commande suivante est lancée immédiatement, sans attendre de code de retour.


Les conditionnelles « if » et les boucles « while » fonctionnent, avec leur syntaxe habituelle (la condition est une commande dont le code de retour est lu ; le jeu d'instruction correspondant est ensuite exécuté), avec toutefois une limitation importante dans le fait que les sous-commandes et lectures de variables ne sont faites qu'une seule fois, lors du parsage, et ne sont donc pas mises à jour ensuite.

Pas la peine, donc, de lancer quelque chose comme « while test "$(ls)" != "" », car le « ls » ne sera alors interprêté qu'une seule fois, et si la condition est vraie au départ, cela donnera une boucle infinie.

Les autres structures habituelles du shell (« for », « case », « select ») ne sont pas prises en compte.


Le truc n'a pas été complètement testé, loin de là, donc n'hésitez pas à signaler un éventuel problème. Normalement, au cas où la commande que vous entrez est erronée, le terminal vous affiche le descriptif de l'erreur.

Envoyer une réponse