Quelles sont les différences fondamentales entre les shells classiques * NIX? [fermé]

52

Quelles sont les différences fondamentales entre les shells classiques * NIX et quels scénarios peuvent vous inciter à utiliser l'un sur l'autre? Je comprends que cela dépend en partie des préférences de l'utilisateur, mais je n'ai jamais utilisé que bash et je suis curieux de savoir lorsqu'un autre shell pourrait être utile.

De plus, y a-t-il un impact sur les scripts de shell écrits par l'utilisateur lors de l'exécution sous un shell ou un autre ou s'agit-il simplement de changer le shell en haut du fichier? Mon instinct dit que ce n'est pas si facile.

conorgriffin
la source

Réponses:

52

Pour une utilisation interactive, il existe deux principaux candidats, bash et zsh , ainsi que le straggler tcsh et le poisson nouveau venu .

  • Bash est le shell officiel du projet GNU et le shell par défaut de la plupart des distributions Linux. Sur d'autres ordinateurs qui ne sont pas livrés avec un shell interactif décent dans le cadre de l'installation de base, je pense que bash est ce que les gens ont tendance à choisir. Voir aussi Pourquoi bash est-il partout? (avec beaucoup d'informations historiques).

  • Zsh a presque toutes les fonctionnalités de bash et de nombreuses autres fonctionnalités (utiles!). Son principal inconvénient est d'être moins connu, ce qui signifie concrètement que vous êtes moins susceptible de le trouver déjà installé sur un système déjà configuré par une autre personne et que la documentation fournie par une tierce partie est moindre. Voir aussi Quelles fonctionnalités zsh utilisez-vous? , Quelles sont les fonctionnalités manquantes dans zsh et manquantes dans bash, ou inversement? .

  • Tcsh était jadis (jusqu’au début des années 90) le shell avec les meilleures fonctionnalités interactives, à l’instar de son prédécesseur csh. Cela l'a rendu populaire pour une utilisation interactive (mais pas pour le script ). Zsh a rattrapé tcsh et s'est assez rapidement amélioré, et bash (fin programmée) au début des années 2000, tandis que tcsh n'a presque pas progressé au cours des 15 dernières années. Par conséquent, il y a peu de raisons d'apprendre tcsh maintenant.

  • Le poisson essaie d'être plus propre que ses prédécesseurs. Il a quelques fonctionnalités intéressantes (syntaxe plus simple, coloration de la syntaxe sur la ligne de commande) mais il en manque d'autres (tout ce que l'auteur n'aime pas). La communauté de poissons est beaucoup plus petite que celle de zsh, ce qui rend les effets encore plus aigus.


Pour le script, vous pouvez cibler plusieurs langues, en fonction de la portabilité de vos scripts.

  • Tout ce qui prétend ressembler à Unix a un shell dérivé de Bourne/bin/sh . Il existe encore des unités commerciales /bin/shnon compatibles POSIX .

  • Presque tous les systèmes Unix qui fonctionnent maintenant ont un shexécutable au moins compatible avec au moins POSIX.2-1992 et généralement au moins POSIX: 2001, également appelé Single Unix v3 . Ce shell peut vivre dans un répertoire différent tel que /usr/bin/posixou /usr/xpg6/bin. Les couches d'émulation POSIX existent également pour à peu près tous les systèmes suffisamment puissants pour le prendre en charge, ce qui en fait une cible attrayante.

  • De nombreux systèmes unix ont ksh93 , qui apporte quelques fonctionnalités très utiles qui sh (tableaux Posix font défaut, les tableaux associatifs, globs étendus ( *(foo), @(foo|bar), ...), null globs ( ~(N)foo*), ...). Ksh était à l'origine un logiciel commercial (il est devenu libre en 2000, après que certaines habitudes se soient figées), et de nombreux logiciels libres (Linux, * BSD) ont pris l'habitude de ne fournir qu'un clone gratuit bien plus ancien ( pdksh ) qui manque de nombreuses fonctionnalités utiles. . Pksh est maintenant déplacé par mksh en dehors de OpenBSD, mais même mksh ne parvient pas à implémenter toutes les fonctionnalités de ksh93. Aujourd'hui, vous ne pouvez pas compter sur ksh93 étant disponible partout, surtout sous Linux où bash est la norme.

  • Bash est toujours disponible sous Linux (à l'exception de certaines variantes intégrées) et souvent sur d'autres ordinateurs. Il a la plupart des fonctionnalités utiles de ksh93, bien que parfois avec une syntaxe différente.

  • Zsh possède la plupart des fonctionnalités utiles de ksh93 et ​​de bash. Sa syntaxe de base est plus propre mais incompatible avec Bourne. À l'exception de macOS, ne comptez pas sur zsh pour qu'il soit disponible sur un système que vous n'avez pas installé.

  • Pour des scripts plus avancés, vous pouvez vous tourner vers Perl ou Python . Ces langages ont des structures de données appropriées, des fonctionnalités de manipulation de texte décentes, une combinaison de processus et des mécanismes de communication décents, ainsi qu'une multitude de bibliothèques disponibles. La plupart des systèmes Unix en disposent, qu’ils soient fournis avec le système d’exploitation ou installés par l’administrateur (car il existe tellement de scripts Perl et Python qu’il s’agit d’un système rare qui n’en possède pas au moins un).

Gilles, arrête de faire le mal
la source
4
Pour les scripts, je cible le tiret (sauf si j'ai besoin des fonctionnalités avancées de bash), qui possède un ensemble de fonctionnalités minimal et qui constitue une plainte pour une compatibilité maximale. (et il est petit et rapide)
hildred
Super documentaion! Deux notes. Premièrement, Solaris est l’un de ces «bureaux commerciaux où / bin / sh n’est pas conforme à POSIX». Plus précisément, il utilise jsh(ce qui n’est pas un shell java!), Qui manque de substitution variable comme ${VAR#foo}et ${VAR%bar}.
Adam Katz
Deuxièmement, il tcshest plutôt populaire parmi les utilisateurs UNIX qui ont appris leurs techniques avant le mi-90 (qui a vu l’introduction des deux ) bashet zsh, en particulier parmi les anciens Cdéveloppeurs UNIX + , qui ont commencé leur vie avec csh(rappel, le c en est cshsynonyme du Clangage , qui était l’inspiration de ses différences avec les coquillages de style bourne). Voir aussi la programmation Csh considérée comme nuisible , que j’utilise souvent pour des astuces sur la magie profonde POSIX (en plus de ses arguments anti-csh).
Adam Katz
Mac OS X n'est jamais "OS / X". (: Et comment est-ce que zsh est incompatible avec Bourne? (Enfin, sauf pour des choses comme les extensions variables qui ne séparent pas les mots.)
SilverWolf - Rétablir Monica
@seaturtle Ne pas développer les extensions de variables avec fractionnement de mots est la différence majeure qui romprait de nombreux scripts sh si vous tentiez de les exécuter avec zsh (à moins que vous n'exécutiez zsh en mode d'émulation sh / ksh).
Gilles 'SO- arrête d'être méchant'
27

Il existe deux types de base de shell, sh (par exemple, bash) et csh (par exemple, tcsh). Pour une utilisation interactive, cela revient principalement à ce que vous êtes habitué. J'ai utilisé csh, puis tcsh, pendant des années et il serait difficile de changer de système, simplement parce que j'y suis tellement habitué. J'ai aussi utilisé bash, et je ne pense pas qu'il y ait de raison impérieuse de changer. Sauf peut-être si l'un ou l'autre n'est pas disponible sur les machines que vous utilisez régulièrement.

Pour la programmation, la syntaxe est différente. Vous ne pouvez pas simplement changer de shell, mais vous devez aussi changer la syntaxe du script. Pour le script, vous voulez utiliser sh ou bash. La syntaxe est beaucoup plus adaptée aux scripts, comme expliqué ici (merci à Riccardo Murri pour le lien. C’est un bon guide sur les scripts bash.

Si vous n'avez pas encore choisi de shell et que vous souhaitez écrire des scripts, j'utiliserais bash uniquement pour réduire le nombre de choses à apprendre.

KeithB
la source
12

À l'époque, quand AT & T avait inventé UNIX, il y avait Bourne Shell, écrit par Steve Bourne. C'était assez basique et il manquait beaucoup d'outils que nous prenons pour acquis de nos jours.

AT & T ne faisant pas vraiment partie du marché UNIX, Berkelely a adopté à l’époque un système d’exploitation très basique qui a apporté quelques modifications à BSD UNIX. Parmi de nombreux changements, il y avait un nouveau shell, appelé csh, qui présentait de nombreuses améliorations par rapport à sh, notamment un meilleur contrôle du travail, une utilisation interactive, etc. Malheureusement, ils ont décidé que la syntaxe de programmation sh était nulle et ils ont créé leur propre copie (quelque peu mal) des styles de codage C. (Un coup de gueule classique est http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Il y avait donc maintenant deux syntaxes.

Plus tard, ils ont apporté des améliorations à CSH en ajoutant la complétion par des onglets et d'autres éléments. Ceci est devenu tcsh, et si vous utilisez CSH, c'est probablement celui que vous utilisez.

AT & T a décidé que ce n’était pas totalement une entreprise UNIX et l’a perfectionné. David Korn (un gars sympa) a créé la coque Korn. Basé sur l'idée d'étendre la syntaxe du shell Bourne, il a ajouté beaucoup de choses pour les programmeurs et l'utilisation interactive. Il existe en fait quelques versions et vous verrez rarement des éléments tels que ksh88 et ksh93, indiquant les variantes.

Viennent ensuite la FSF et le système d’exploitation GNU. Ils voulaient créer leur propre système d’exploitation compatible avec UNIX, le Hurd, et souhaitaient un meilleur shell. Ils ont appelé bash, pour Bourne Again SHell. Les règles POSIX sont entrées à peu près à la même époque et ils voulaient créer le shell POSIX. Ils ont examiné la syntaxe du shell Bourne et les améliorations apportées au shell Korn, ainsi que le vol et l'extension des fonctionnalités interactives de tcsh. C'est devenu le shell de facto sous Linux, donc c'est très courant.

Il y a aussi le zsh, écrit pour être le shell "ultime". C'est aussi très courant dans le monde Linux. Il a étendu bash (et un peu pollinisé, quelques nouvelles choses sont retournées à bash).

Si je devais choisir un shell, je choisirais bash ou zsh. bash est peut-être dans quelques endroits plus nombreux que zsh. zsh est plus puissant, mais bash me convient. Le shell Bourne réel / bin / sh est disponible uniquement pour des raisons historiques. bash a à peu près tout ce que ksh a à offrir et plus encore. La syntaxe est plus propre que csh ou tcsh et offre de meilleures fonctionnalités que l'une ou l'autre.

Convertir un script dépend de quoi à quoi. Le style de shell Bourne (sh, ksh, bash, zsh) vers ou depuis le style csh (csh, tcsh) sera difficile. Passer de l'ancien au plus récent (/ bin / sh => bash, / bin / ksh => zsh) sera plus facile que l'inverse.

Rich Homolka
la source
Notez que la page csh-whynot a été écrite en septembre 1995 (vérifiez la balise de version en haut). Je ne sais pas, mais je m'attends à ce que beaucoup de choses aient changé depuis 18 ans.
un CVn
8

Les deux branches principales des coques sont les dérivés de la coque Bourne (sh, bash, ksh, cendre, yash et zsh) et les dérivés de csh (tcsh et ... euh ... tcsh).

Je soupçonne (même si je n’ai pas de chiffres réels) que bash est le plus utilisé, il semble être le shell par défaut de la plupart des linux.

La plupart des choses écrites dans un dérivé d'une coquille de bourne fonctionneront probablement avec d'autres. La plupart des choses écrites dans un shell Bourne devront probablement être modifiées pour fonctionner sous csh ou tcsh.

Personnellement, j'ai utilisé ksh lorsque j'ai commencé, car c'était ce qui était sur le système que j'utilisais. J'utilise principalement bash maintenant.

mazianni
la source
1
le poisson est une coquille inspirée de csh
hildred
1

J'ai utilisé de nombreux obus au fil du temps. Pas quelque chose de super avancé, mais beaucoup de choses pratiques en matière de sysadmin et de programmation qui ont nécessité une personnalisation suffisante.

Je pense que zsh a plus d'options de personnalisation, du moins qu'auparavant, mais après l'avoir utilisé pendant plusieurs années, j'en ai eu assez des problèmes de stabilité et de codage des caractères. Bash est solide comme un roc, n'a jamais eu de problèmes similaires et il est installé partout.

Ari T
la source