Caractéristiques uniques de bash par rapport à zsh

67

Je suis un utilisateur de zsh depuis un certain temps (avant ce tcsh et avant ce csh). J'en suis assez content, mais je me demandais s'il existe des caractéristiques convaincantes de bash qui n'existent pas dans zsh. Et inversement, existe-t-il des fonctionnalités zsh qui n'existent pas dans bash? Mon sentiment actuel est que bash est meilleur:

  • Si vous le connaissez déjà et que vous ne voulez pas apprendre une nouvelle syntaxe.
  • Il existera par défaut sur la plupart des machines * nix, alors que zsh peut être une installation supplémentaire.

N'essayant pas de commencer une bataille religieuse ici, c'est pourquoi je cherche simplement des caractéristiques qui n'existent que dans l'un des coquillages.

Tim
la source
10
Comment les caractéristiques propres à l'un ou à l'autre sont-elles subjectives? Honnêtement, je ne cherche pas une guerre des flammes et pense que la familiarité de l'un ou de l'autre est probablement une bonne raison de préférer cette coquille.
Tim

Réponses:

40

zsh est pour les vulcans. ;-)

Sérieusement: bash 4.0 a quelques fonctionnalités qui ne se trouvaient auparavant que dans zsh, comme ** globbing:

% ls /usr/src/**/Makefile

est équivalent à:

% find /usr/src -name "Makefile"

mais évidemment plus puissant.

D'après mon expérience, l'achèvement programmable de bash fonctionne un peu mieux que celui de zsh, du moins dans certains cas (compléter des paquets debian pour aptitude, par exemple).

bash doit Alt + .insérer!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...
0x89
la source
8
En bash, C-M-eà « shell-expand-line », qui se développerait cat `echo blubb | sed 's/u/a/'` à cat blabbet echo $SHELLà echo /bin/bashdans mon cas. En outre, C-x *à "glob-expand-word", qui se développerait rm *.
Victor
16

J'aimerais souligner que bash n'est pas installé par défaut sous FreeBSD, OpenBSD ou NetBSD, et qu'il n'est pas installé par défaut sous Solaris 10 (OpenSolaris l'a par défaut), la dernière fois que j'ai utilisé un système AIX, et ou Les serveurs HP-UX n’ont pas été installés par défaut non plus.

En outre, sur OpenSolaris / bin / sh n’est PAS bash. C'est ksh. Le plus gros problème que j'ai en tant que porteur de logiciel, ce sont les gens qui supposent que / bin / sh est bash et qu'il acceptera la syntaxe bash étendue. Bien que cela semble être le cas sur la plupart des distributions Linux, ce n'est pas le cas ailleurs et c'est vraiment ennuyant.

X-Istence
la source
6
Oui, tu as raison. Hélas, tous ces constructeurs rendent très facile l’installation de bash comme paquet supplémentaire. +1 pour avoir souligné le besoin de purisme / bin / sh dans les scripts.
Kubanczyk
@kubanczyk: Si vous travaillez sur des machines auxquelles vous n'avez pas accès, il se peut que l'installation ne soit pas aussi simple, alors je pense que le point de X-Istence est valable. (Je travaille sur un tas de boîtiers Solaris, et les administrateurs système sont tous des junkies de ksh. La dernière fois que j’ai essayé de compiler mon propre logiciel sans lequel je ne pourrais pas vivre (git dans ce cas), le compilateur installé présentait des défauts. cette route m'a été coupée.)
iconoclaste le
12

Bien que je sois un utilisateur bash, je trouve l’une des fonctionnalités de zsh assez chouette: RPS1.

Rappelles toi:

  • PS1: l'invite alignée à gauche
  • RPS1: l'invite alignée à droite

Échantillon:

Lorsque vous utilisez quelque chose comme

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Vous obtenez votre invite à gauche et le répertoire en cours poussé à droite. Il disparaît même lorsque la ligne actuelle devient trop longue! C'est parce que zsh est suffisamment intelligent pour donner une faible priorité à RPS1.

Vous pouvez voir une capture d'écran de cet exemple à l' adresse http://imgur.com/OAZhC .

Chucky
la source
9

Zsh a une correction orthographique. Si vous êtes une lettre (ou plus) de côté, cela déterminera ce que vous vouliez dire.

Il a également une finition plus robuste des onglets, ce que j'aime bien.

Zsh dispose d'un utilitaire de configuration interactif qui vous permet de définir comment vous le souhaitez.

Certains tests de vitesse indiquent que zsh est plus rapide, mais je n’ai remarqué aucune différence.

Mage
la source
1
Une version simplifiée de dash qui ne prend en charge qu'un sous-ensemble de ses fonctionnalités et qui est conçue pour être utilisée dans des scripts à exécuter rapidement (ceux de démarrage, par exemple) est dash.
Chucky
zsha même un paramètre permettant les types d'erreur «une lettre désactivée» pour l'utilisation du clavier Dvorak.
vgoff
6

Je ne connais aucune fonctionnalité de bash que zsh ne prend pas en charge. L'objectif de conception de zsh semble inclure la prise en charge des fonctionnalités ajoutées par bash.

J'utilise toujours bash au lieu de zsh. Je rencontre rarement des fonctionnalités convaincantes que zsh prend en charge, contrairement à bash. Des problèmes occasionnels liés à zsh au fil des années, ou inexistants sur certains systèmes, ont rendu inutile la transition.

Je peux enfin utiliser le même shell sur tous les systèmes Unix, cela ne vaut pas la peine de le casser pour des fonctionnalités que je n'utiliserai jamais.

Les fonctionnalités présentes dans zsh qui ne le sont pas dans bash semblent pour la plupart être mignonnes mais pas celles qui importent au quotidien.

carlito
la source
3

bash a de nombreuses fonctionnalités qui n'étaient auparavant que dans zsh. Vous pouvez désormais avoir «finalisation intelligente des onglets» avec bash, comme tous les utilisateurs d'ubuntu récents l'ont découvert.

Rory
la source
1

La substitution de processus et l'extension étendue sont les deux fonctionnalités qui me manqueraient le plus. Les paramètres d'invite sont également très intéressants: vous pouvez voir le niveau d'imbrication lorsque vous tapez des instructions complexes sur les lignes de commande. Le chargement automatique permet d'inclure de nombreuses fonctions dans chaque shell.


la source
Je suppose que vous voulez dire que ceux de zsh vous manqueraient, puisque tout ce que vous avez mentionné est inclus dans zsh? (Mais êtes-vous sûr qu'ils sont tous absents de bash? Cela me surprendrait.) Quoi qu'il en soit, ajouter que cela éclaircirait votre réponse, car il y a des gens qui répondent des deux côtés de la barrière bash / zsh. En outre, il serait utile que vous donniez des exemples de la manière dont chacune de ces fonctionnalités facilite la vie de votre shell.
iconoclast
0

Je suis un fan de zsh à cause du support du mode vi, mais je découvre qu'il n'est pas très utilisé. Je pense avoir lu que zsh aime utiliser les fonctionnalités populaires des autres shells et les combiner (les éléments spécifiques à bash et ceux spécifiques à csh sont tous deux disponibles en zsh).

Quelqu'un a également dit que je modifiais mon facteur geek en utilisant zsh, mais je ne peux ni confirmer ni infirmer cette rumeur.

Milner
la source
5
et oui, bash prend également en charge vi-mode.
Pjz
@Milner: pouvez-vous expliquer quel type de prise en charge du mode vi est dans zsh et non dans bash? Si vous parlez simplement de la possibilité de définir l'option -o vi sur la ligne de commande, c'est clairement dans les deux cas. S'il existe un support étendu dans zsh, pouvez-vous décrire clairement ce que c'est et ce qu'il ajoute?
iconoclast
-1

Popularité, #bash 430 utilisateurs. #zsh 123 utilisateurs. Je crois que le site Web de zsh offre une bonne comparaison de zsh avec d’autres coques. zsh a un meilleur support du mode vi.

Ian Kelling
la source
2
Comment le vi-mode dans zsh est-il meilleur? Comme je suis un utilisateur bash et que vi-mode est activé, j'aimerais savoir s'il y a un quelconque avantage à changer.
Ptman
1
@ptman: l'invite de zsh peut indiquer le mode (insert / normal). Readline ne peut pas faire ça. Le prompteur est également plus flexible: vous pouvez avoir la coloration syntaxique, etc.!
unperson325680
@progo: ahh! très agréable. Maintenant, je pourrais commencer à utiliser le mode vi en zsh. C’est l’une des raisons pour lesquelles j’ai choisi de rester en mode emacs jusqu’à présent.
iconoclaste le
@Brandon, cette petite amélioration a été la raison pour laquelle j'ai changé de coque.
unperson325680
-1

Bash utilise la même syntaxe pour if et while, qui peuvent être utilisés dans les scripts / bin / sh de la ligne de commande.
Dans zsh, la syntaxe est différente. Pour utiliser efficacement zsh, vous devez vous souvenir des deux, si vous utilisez une instruction if ou while sur votre ligne de commande.

Michèle
la source
1
J'ai essayé ceci en utilisant if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fià la fois la ligne de commande et un script, et cela a fonctionné comme prévu dans les deux cas. Il semblerait donc que vos faits ne soient pas clairs.
iconoclast
Cela dépend de ce que vous avez installé en tant que / bin / sh. Si / bin / sh est bash, alors vous avez raison. Sinon, bash n'a pas cet avantage. Si zsh est / bin / sh, zsh a cet avantage. Compte tenu de tous les différents shells pouvant fournir / bin / sh, je recommande personnellement d’utiliser le shell que vous voulez pour les scripts, de sorte que son absence pointe vers un problème avec une solution évidente, plutôt que des comportements bizarres sans aucune idée de la procédure à suivre. résoudre.
Ed Grimm le