Pourquoi et quand utiliser shell au lieu de Ruby

Étant donné que je suis familier avec Ruby, je suis sur le sharepoint créer quelques scripts sur OSX en l’utilisant. Mais alors j’ai pensé, peut-être que je manque le bateau. Je connais beaucoup de raisons de préférer Ruby over Bash (ou tout autre interpréteur en langage de commande compatible sh), mais je ne connais aucune raison de ne pas le faire. Quel est l’avantage de programmer le shell directement?

Je compte tirer parti des commandes system utilisant le system chaque fois que cela est nécessaire.

Note: je sais déjà que Ruby ne sera pas toujours là, mais je m’intéresse surtout aux critères techniques, sémantiques et syntaxiques.

Edit: En Ruby, pas toujours présent, je veux dire que ce n’est pas une partie standard de toutes les dissortingbutions * nix, contrairement à vi .

Le langage de programmation du shell est terrible sauf pour une chose.

Pipelines

Le langage de programmation du shell pour les pipelines est totalement anormal.

Le | , & et ; opérateurs, plus () et “ `forment un petit langage pour décrire les pipelines.

a & b est concurrente

a ; b a ; b est séquentiel

a | b a | b est un pipeline où une alimentation b

Cette partie de la programmation de coquilles est importante.

Pensez à ( a & b & c ) | tee capture | analysis ( a & b & c ) | tee capture | analysis ( a & b & c ) | tee capture | analysis comme le genre de chose qui est difficile à exprimer en Python (ou Ruby). Vous pouvez faire beaucoup de choses avec iterpipes , mais pas tout à fait.

Une grande partie du rest, vous pouvez vivre sans, et utiliser Python (ou Ruby) et vous serez plus heureux et plus productif.

La plus grande chose à surveiller est tout ce qui concerne expr au niveau du shell. Dès que vous commencez à essayer de faire des “calculs”, vous êtes sorti de la zone cible du shell et vous devez arrêter de programmer dans le shell et repenser ce que vous faites.

Ruby a un énorme avantage: vous connaissez Ruby et (je suppose) vous ne connaissez pas bien Bash!

Personnellement, j’utilise Ruby pour les scripts complexes et Bash pour les scripts simples – le point d’arrêt pour moi est généralement tout ce qui possède un ensemble correct de parameters de ligne de commande – mais je connais à la fois Bash et Ruby.

Je vous conseille d’utiliser Bash pour tout ce qui est suffisamment simple pour que vous puissiez l’utiliser au préalable sur la ligne de commande, par exemple:

 who |grep -i admin |cut -c10-20 

– et utiliser Ruby pour autre chose

La fonctionnalité principale de bash est d’exécuter d’autres applications en ligne de commande. Faire en sorte que ces programmes interagissent les uns avec les autres, etc.

Écriture directe Posix ou script bash fonctionne bien pour les opérations qui effectuent une boucle sur les listes de fichiers. Des choses comme

 find . -name \*.htm | while read x; do # whatever done 

Le shell peut raisonnablement faire la substitution de commandes et les transformations de parameters simples. Les procédures Shell permettent des programmes relativement complexes.

La transition vers quelque chose comme Ruby se produit lorsqu’une structure de données interne est nécessaire. Le shell est un processeur de macro, donc il est capable de quelque chose comme “métaprogrammation” où vous créez des noms de variables. Certaines versions de bash ont des tableaux et toutes les versions peuvent “métaprogrammer” les noms de variables où l’index fait partie du nom.

Mais c’est du piratage à 100% et même les tableaux intégrés sont rudimentaires. Une fois les décisions sockets et les structures de données conservées, il est temps de passer à Ruby.

Je ne vois aucun problème avec Ruby. Vous pouvez utiliser la coche arrière au lieu du system et insérer des éléments tels que

 `cp ${source} ${dest}` 

En outre, vous pouvez facilement obtenir le contenu de stdout (pas sûr de stdin) et former votre propre petit problème de pipeline.

Je pense que Ruby est une solution gagnante pour faire des scripts, mais moins comme un shell général en raison du peu de chance de devoir toujours se rappeler de faire des back-ticks pour exécuter des commandes.

Les commentaires sur la façon dont le shell gère les canalisations sont précis. Cependant, si vous êtes intéressé par une approche rbuyante de la coquille, vous pourriez regarder la ruée . Il y a des observations immédiates (en dehors de la manipulation de la tuyauterie) telles que les chemins sont désormais traités de manière totalement différente, mais si vous voulez des choses simples comme des iterators et des blocs, vous avez tout à scope de main.

Probablement pas un remplacement complet dans tous les cas, mais cela pourrait vous servir.

[Edit] Un rapide tour d’ horizon a permis à ipython de regarder (en un coup d’œil) pour donner plus de sensations naturelles à un environnement de shell qui peut ou non être une incitation pour vous.

@OP, si vous voulez comparer Ruby vs Shell, comparez en utilisant l’interpréteur de Ruby (sans bibliothèques / modules). c.-à-d. comparer ses in-builts contre la shell. Sinon, ils sont presque les mêmes. Pourquoi? Par exemple, si vous voulez faire des calculs avancés autres que ceux fournis par le shell, le shell peut utiliser bc / awk / dc. Ce sont les “bibliothèques” mathématiques pour le shell. Si vous souhaitez des structures de date telles que des tableaux associatifs, vous pouvez utiliser awk. (équivalent à un hachage en rbuy). Dans le shell bash moderne, il existe également des tableaux associatifs. Vous pouvez penser à des outils externes * nix (par exemple, wc, grep, sed etc et ceux de / usr / bin /, / usr / sbin, etc.) en tant que “bibliothèques” du shell.

Enfin, si vous envisagez d’utiliser beaucoup system () dans Ruby, je suggère d’utiliser le shell comme l’un d’eux l’a mentionné, le shell excelle dans les pipes. etc..

Les langages de programmation de Shell ont un très faible encombrement et peu de dépendances. A côté de ça, je ne vois pas grand chose à dire. Personnellement, je préfère utiliser Perl ou Python pour de telles tâches.