web-dev-qa-db-fra.com

Y a-t-il une utilité pour les scripts Bash?

Je viens de terminer ma deuxième année en tant qu'étudiant universitaire CS, donc mes connaissances "du monde réel" manquent. J'ai appris Java ma première année, j'ai continué avec Java et j'ai choisi C et de simples scripts Bash ma deuxième. Cet été, j'essaie d'apprendre Perl (Dieu aidez-moi.) J'ai tâté avec Python un peu dans le passé.

Ma question est, maintenant que nous avons des langages de script très lisibles, très inscriptibles comme Python, Ruby, Perl, etc., pourquoi quelqu'un écrit-il des scripts Bash? Y a-t-il quelque chose qui me manque? Je sais que ma boîte linux a Perl et python. Ne sont-ils pas assez omniprésents? Y a-t-il vraiment quelque chose de plus facile à faire dans Bash que dans un autre hll?

69
Daniel Harms

Entre autres choses, bash est utile lorsque la plupart de ce que vous faites est de communiquer et de canaliser entre divers programmes (dont beaucoup sont également standard). Et il existe de nombreux environnements où bash (ou au moins un POSIX Shell ) est disponible mais Perl et Python ne le sont pas.

Et bien sûr, vous devez faire la distinction entre bash interactif et bash scripté. Ubuntu a récemment changé son shell scripté par défaut (#!/bin/sh) à tiret parce que c'était beaucoup plus rapide. Cependant, bash a des fonctionnalités interactives utiles, le tableau de bord ne le fait pas ( zsh est toujours mieux, à mon humble avis).

57
Matthew Flaschen

Bash est incroyablement utile dans l'administration système, le déploiement d'applications Web, le crunching de données, les sauvegardes automatisées, même faire les choses au jour le jour pour n'en nommer que très peu. Je pense qu'il est trop tôt pour vous de juger un "vétéran de l'informatique" comme BASH.

EDIT googler autour:

Je voudrais également mentionner que TextMate un programme OS-X réussi a beaucoup de machines Bash à l'intérieur.

34
microspino

Les scripts Bash vous permettent de automatiser les tâches de ligne de commande en utilisant même langage vous le feriez si vous saisissiez les commandes manuellement.

Exemple trivial pour lister $ PATH

Bash

#!/bin/sh
echo $PATH

Python

import os
print os.getenv("path")
24
mikek3332002

La vraie différence entre bash et python est que python est un langage de script à usage général, tandis que bash est simplement un moyen d'exécuter une myriade de petits (et souvent très rapidement) des programmes en série. Python peut le faire, mais il n'est pas optimisé pour cela. Les programmes (trier, rechercher, uniq, scp) peuvent effectuer des tâches très complexes très simplement, et bash permet à ces tâches d'interagir très simplement avec la tuyauterie, de vider la sortie dans et hors des fichiers ou des périphériques, etc.

Alors que Python peut exécuter les mêmes programmes, vous serez obligé de faire des scripts bash dans le script python pour accomplir la même chose, puis vous êtes coincé avec les deux python et bash. Les deux sont très bien par eux-mêmes, mais un mélange de ceux-ci n'améliore rien à mon humble avis.

24
daramarak

Pour de nombreuses tâches, bash peut être très très concis. Code pour rechercher une chaîne dans tous les fichiers du répertoire courant et imprimer ces lignes:

En bash:

grep -ir "search_term" .

En Python:

for file in os.listdir('.'):
  file_content = open(file).readlines().split('\n')
  for line in file_content:
    if line.count("search_term") > 0:
      print file, ": ", line
14
n1kh1lp

Je pense qu'un argument fort selon lequel python n'est pas aussi naturel que bash pour de nombreuses tâches est le simple fait que personne n'utilise l'interprète python comme shell). C'est clairement possible:

python> import os, subprocess
python> os.chdir(os.path.expanduser("~/work"))
python> subprocess.call(["vim","README"])

Il est clair que l'utilisation de python pour un shell est absurde. Bash a été conçu pour exécuter d'autres programmes. Python a été conçu pour effectuer des calculs. Alors que la plupart des choses peuvent être faites dans dans les deux langues, il y aura toujours des tâches qui peuvent être effectuées plus facilement en bash qu'en python et vice versa).

10
Quantum7

Eh bien, lorsque vous écrivez avec bash, vous pouvez utiliser directement tous les outils possibles que vous avez sur la ligne de commande pour votre script. Avec n'importe quel autre langage, vous devez d'abord exécuter cette commande et obtenir un résultat, etc. Un script simple qui (par exemple) obtient une liste de processus, exécute grep et obtient un résultat serait beaucoup plus compliqué dans d'autres langages. En tant que tel, bash est toujours un bon outil pour écrire des choses rapides.

7
poke

De nombreux scripts de démarrage sont traditionnellement écrits sous forme de scripts Shell et il ne semble pas y avoir de tendance à s'en éloigner.

Les scripts shell sont parfaitement adaptés pour démarrer d'autres processus et coller leurs entrées/sorties ensemble. C'est un domaine où les autres langages de script ne sont pas aussi puissants.

En dehors de cela: même si des langues comme Perl, Python et Ruby deviennent de plus en plus omniprésentes, la seule langue que vous êtes pratiquement garanti sur chaque système de type Unix est le Bourne Shell ('mais pas nécessairement sous la forme bash ).

4
Joachim Sauer

En dehors de ce que les autres ont dit, je voudrais souligner quelle est à mon avis la principale raison d'apprendre Bash: c'est le (presque) standard Linux Shell .

D'autres langages de script sont sûrement utiles, et peut-être beaucoup plus puissants, mais ce que vous aurez à faire lorsque vous aurez un terminal devant vous, c'est ... Bash.

Être capable de gérer les E/S, les canaux et les processus, évaluer et utiliser des variables, et faire au moins une évaluation de boucle et de condition est un must, si vous voulez gérer un système Linux.

4
Massimo

Bash n'est pas seulement un langage de script, mais c'est un Shell.

Langages et interpréteurs de commandes
Article principal: Script shell

Une classe importante de langages de script est issue de l'automatisation du contrôle des tâches, qui concerne le démarrage et le contrôle du comportement des programmes système. (En ce sens, on pourrait penser que les shells sont des descendants du JCL d'IBM, ou Job Control Language, qui a été utilisé exactement à cette fin.) De nombreux interprètes de ces langages servent également d'interprètes de ligne de commande tels que le shell Unix ou le MS-DOS COMMAND.COM. D'autres, comme AppleScript, proposent l'utilisation de commandes de type anglais pour créer des scripts. Ceci combiné avec les frameworks Cocoa de Mac OS X permet à l'utilisateur de créer des applications entières en utilisant des objets AppleScript et Cocoa.

Python, Ruby et Perl sont excellents, mais sont des outils plus généraux; dans certains cas (appareils intégrés ou autres systèmes minimalistes), ils peuvent être considérés comme des ballonnements ou dans d'autres situations, ils peuvent poser un risque pour la sécurité ( pour les environnements où vous souhaitez une sécurité très élevée et essayez d'éliminer tout paquet inutile).

Dans certains cas, les scripts Shell fonctionneront beaucoup mieux en raison d'une intégration plus étroite avec le système d'exploitation.

De plus, bash est éprouvé en production pour une multitude de tâches administratives et il est facile de trouver des scripts qui couvriront des scénarios très complexes (exceptions) et de les gérer avec élégance.

3
Unreason

Plus facile, probablement pas. Je préfère en fait Perl aux scripts bash dans de nombreux cas. Bash a cependant un avantage, en particulier sur les systèmes Linux: il est presque garanti d'être installé. Et si ce n'est pas le cas, son père (sh) largement compatible le sera, car presque tous les scripts système sont écrits pour sh. Même Perl n'est pas omniprésent, et il est partout partout.

2
cHao

Bash (et le Bourne sh original et une myriade de dérivés) est - d'un point de vue - un langage de haut niveau. Lorsque de nombreuses langues utilisent des primitives simples, les primitives Shell sont des programmes entiers.

Que ce ne soit pas la meilleure langue pour exprimer vos tâches ne signifie pas qu'il est mort, mourant ou même moribond.

2
msw

Je suis un gars Perl, mais le nombre de fonctions bash (ou ksh) que j'utilise et crée quotidiennement est assez important. Pour tout ce qui est impliqué, j'écrirai un script Perl, mais pour naviguer dans la structure du répertoire, et en particulier pour manipuler les variables d'environnement bash/ksh/... sont indispensables.

Encore une fois, en particulier pour les variables d'environnement, rien ne vaut Shell, et bon nombre de programmes utilisent des variables d'environnement. En Perl, je dois écrire un alias ou une fonction bash qui appelle le script Perl, qui écrit un script bash temporaire, qui est ensuite obtenu après la sortie de Perl afin de faire le changement dans le même environnement que je lance.

Je l'ai fait, en particulier pour les variables lourdes sur les chemins. Mais il n'y a aucun moyen de le faire en juste Perl (ou python ou Ruby ... ou C-code d'ailleurs).

2
Axeman

Si vous faites beaucoup de choses sur l'interface graphique, vous ne rencontrerez probablement bash que lorsque vous effectuez une sorte de personnalisation sur votre propre machine. Divers hacks et autres. Si vous utilisez la ligne de commande pour faire des choses, bash est tout simplement indispensable. En fait, être bon sur la ligne de commande nécessite bash ou une autre familiarité avec Shell.

Je tire des kilomètres d'avoir appris Bash lorsque je voulais naviguer rapidement sur mon disque dur. J'ai écrit une interface de navigation/menu qui me permet de transmettre rapidement et facilement différents dossiers et fichiers. L'écrire en bash était simple et facile. Et il y a beaucoup de choses faciles d'accès et gratuites qui vous montreront comment.

En outre, l'apprentissage de Bash est idéal pour comprendre comment Unix et certains éléments essentiels fonctionnent réellement - et jusqu'où nous sommes arrivés avec des outils comme Python.

2
brainysmurf

Ce que je ne comprends pas, c'est pourquoi les gens disent bash quand ils veulent dire bourne-Shell Shell compatible.

Lors de l'écriture de scripts Shell: toujours essayez d'utiliser des constructions qui fonctionnent également dans les anciens interpréteurs shell Bourne. Cela vous évitera beaucoup de problèmes un jour.

Et oui, les scripts Shell sont largement utilisés aujourd'hui, car le Shell existe toujours sur tous les unix, prêt à l'emploi, contrairement à Perl, python, csh, zsh, ksh (éventuellement?), Etc. La plupart du temps, ils ajoutent seulement une commodité supplémentaire ou une syntaxe différente pour les constructions comme les boucles et les tests. Certains ont des fonctionnalités de redirection améliorées.

La plupart du temps, je dirais que le bourne Shell ordinaire fonctionne aussi bien.

Écueil typique: if ! test $x -eq $y fonctionne comme prévu dans bash qui a un opérateur "if" intégré plus intelligent, mais le "correct" if test ! $x -eq $y devrait fonctionner dans tous les environnements.

1
MattBianco

D'après mon expérience, Perl répond à quelque chose comme 99% des besoins qui pourraient nécessiter un script Shell. En prime, il est possible d'écrire du code qui s'exécute sur Windows sans Cygwin. Si je ne souhaite pas installer Perl sur une boîte Windows que je souhaite cibler, je peux utiliser PAR :: Packer ou PerlApp pour produire un exécutable. Python, Ruby et d'autres devraient également fonctionner aussi bien.

Cependant, l'écriture de scripts Shell n'est pas si compliquée - au moins les choses que vous devriez écrire dans un shell ne sont pas si compliquées. Vous pouvez faire ce que vous devez faire avec un niveau de connaissances assez faible.

Apprenez à lire et à définir des variables. Comment créer et appeler des fonctions. Comment source d'autres fichiers. Découvrez comment fonctionne le contrôle de flux.

Et surtout, apprenez à lire la page de manuel Shell. Cela peut sembler facétieux, mais je suis 100% sérieux - ne vous inquiétez pas de fourrer chaque détail des scripts Shell dans votre cerveau, apprenez plutôt à trouver rapidement et efficacement ce que vous devez savoir dans la page de manuel. Si vous utilisez souvent les scripts Shell, les informations pertinentes resteront naturellement dans votre cerveau.

Donc, oui, Shell de base mérite d'être appris.

1
daotoad

Comme mentionné, les outils GNU sont excellents et sont plus faciles à utiliser dans le Shell. C'est particulièrement bien si vos données sont déjà sous une forme linéaire ou tabulaire de texte brut. Tout comme un exemple , l'autre jour, j'ai pu créer un script pour créer un nuage de mots XHTML de n'importe quel fichier texte dans 8 lignes de Bourne Shell, qui est encore moins puissant (mais plus largement pris en charge) que Bash.

1
l0b0

Vous pouvez obtenir un vrai bournesh sur freshmeat (sur Mac OS X, par exemple,/bin/sh n'est pas un vrai bournesh).

Comment identifier une coquille Bourne traditionnelle? ... Une simple vérification d'une caractéristique souvent non documentée mais caractéristique: vous pouvez utiliser le circonflexe ^ (caret) en remplacement de | (tuyau).

voir: http://www.in-ulm.de/~mascheck/bourne/

1
pete