Quelles sont les fonctionnalités manquantes dans zsh et absentes de bash, ou inversement?

62

En tant qu'utilisateur Linux, je n'ai toujours utilisé que bash, car c'était la valeur par défaut pour chaque distribution que j'utilisais. Les personnes utilisant d'autres systèmes Unix tels que BSD semblent en utiliser beaucoup plus fréquemment. Pour apprendre un peu plus, j'ai décidé d'essayer zsh.

En tant qu'utilisateur bash:

  • Quelles fonctionnalités vais-je manquer?
  • Et que dois-je rechercher?
Macha
la source
5
@Gilles un jour, il serait peut-être intéressant que tous ceux-ci soient déménagés ici ... et fusionnés
xenoterracide

Réponses:

45

Il y a déjà eu pas mal d'activité sur le sujet sur d'autres sites Stack Exchange. Mon expérience de basculement de bash à zsh, autant que je puisse m'en souvenir (c'était il y a des années²), c'est que je n'ai rien oublié. J'ai beaucoup gagné; Voici ce que je pense être les fonctionnalités simples spécifiques à zsh que j'utilise le plus:

  • La fonctionnalité zsh qui me manque le plus lorsque j'utilise occasionnellement bash est autocd: en zsh, exécuter un répertoire signifie le modifier, à condition que vous autocdactiviez l' option.

  • Une autre fonctionnalité très utile est la fantaisie Globbing. Les caractères hiéroglyphes sont un peu difficiles à retenir mais extrêmement pratiques (comme dans, il est souvent plus rapide de les rechercher que d'écrire la findcommande équivalente ). Quelques exemples parmi les plus simples:
        foo*~*.bak= toutes les correspondances foo*sauf celles correspondant *.bak
        foo*(.)= uniquement les fichiers normaux correspondant foo*
        foo*(/)= uniquement les répertoires correspondants foo*
        foo*(-@)= uniquement les liens symboliques pendants correspondant foo*
        foo*(om[1,10])= les 10 fichiers les plus récents correspondant foo*
        foo*(Lm+1)= uniquement les fichiers de taille> 1 Mo = dans le répertoire et tous ses éléments. sous-répertoires, récursivement⁴
        dir/**/foo*foo*dir

  • Pour les zmvrenommés fantaisistes, la commande intégrée peut être pratique. Par exemple, pour copier chaque filevers file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Bash et zsh ont tous deux un système de complétion décent qui doit être activé explicitement ( . /etc/bash_completionou autoload -U compinit; compinit). Zsh est beaucoup plus configurable et généralement plus sophistiqué.

Si vous exécutez zsh sans le .zshrc, il lance un menu interactif qui vous permet de choisir les options de configuration. (Certaines distributions peuvent désactiver cette autoload zsh-newuser-install; zsh-newuser-installoption ; dans ce cas, exécutez-la .) Je vous recommande d'activer les options d'historique recommandées, d'activer la complétion («nouveau style») et d'activer les «options de shell communes», à l'exception de beep. Plus tard, configurez plus d’options à mesure que vous les découvrez.

² À l’époque, l’achèvement programmable était la fonction la plus meurtrière de zsh, mais elle l’a acquis peu de temps après.
Les fonctionnalités que bash n'a acquises que dans la version 4 (elles ne sont donc toujours pas disponibles sur de nombreux systèmes) sont de type plus petit.

Gilles, arrête de faire le mal
la source
5
Bash 4.0 prend désormais en charge la autocdfonctionnalité décrite ci-dessus. Activer la fonctionnalité à l'aide de la commande shopt -s autocd. Ensuite, la fonctionnalité fonctionne comme vous l'avez décrit.
Philluminati
zsh a également la wherecommande intégrée , à ne pas confondre avec la whichcommande.
Sildoreth
@ Edgrimm Je pense que GNU et FreeBSD find peuvent faire tout ce que les qualificateurs zsh glob peuvent faire (avec -execun shell pour des choses comme la sélection avec eet un pipeline dans des outils comme sortet sedpour la réécriture eet le tri). Beaucoup plus verbalement, bien sûr.
Gilles, arrête de faire le mal
Après avoir vérifié et revérifié la page de manuel de find pendant plus de dix ans, je suppose que j'ai arrêté de vraiment regarder. Mais si j'avais vérifié une dernière fois avant de commenter, j'aurais au moins vu l'option -size maintenant les unités en octets.
Ed Grimm
11

De plus, la complétion par défaut des onglets est meilleure que bash ... par exemple ...

~/.e.dTAB va s'étendre à ~/.emacs.d/zsh, bash va juste émettre un bip.

ocodo
la source
ça n'a pas. Quelle setoptoption non par défaut utilisez-vous pour cela (le cas échéant)?
J'ai réalisé que j'ai _-.défini comme un joker. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Voir stackoverflow.com/q/7906078/311660
lundi
10

zshvous permet de modifier une commande multiligne (voir Editeur de ligne zsh ), mais pas Bash. Si vous essayez la même astuce ( Ctrl-p), bash récupère la dernière commande.

Pedro Silva
la source
2
Bash le fait, au moins à partir de la version 4.2.37; il remplace les nouvelles lignes par des points-virgules et vous donne une seule ligne à modifier.
Keith Thompson
1
Toujours pas aussi bien. (:
SilverWolf
8

Bash a la particularité de pouvoir ouvrir des ports en utilisant

/dev/tcp/host/port

ou

/dev/udp/host/port

Cependant, il est désactivé dans Debian car il est perçu comme un obstacle (si le chemin existe réellement) et sort du cadre de ce qu’un shell devrait faire. Plus d'informations [liste de diffusion debian]

Portablejim
la source
5
zsh a la fonction intégrée ztcp, bien que celle-ci ait plus de fonctionnalités que celle de / dev / tcp de bash, mais n'a pas / dev / udp. Je préférerais utiliser socat cependant.
Stéphane Chazelas
2

Qui - amélioré dans zsh

La whichcommande dans bash ne révèle que l'emplacement d'une commande.

En Zsh whichrévélera la définition d'un alias, la source d'un functionet l'emplacement d'une commande.

Disons que nous avions un alias de shell:

alias gg='git log'

Dans Bash si on demandait: which ggle résultat serait nul

En Zsh: which ggva nous donner ...

gg: aliased to git log

Disons que nous avons une fonction shell:

hello() {
    echo "Hello World"
}

Dans Bash si nous demandions: which hellole résultat serait nul.

En Zsh: which hellova nous donner ...

hello() {
    echo "Hello World"
}
ocodo
la source
Bash fournit les mêmes fonctionnalités via la typecommande (intégrée). Et juste pour nitpick: whichest une commande externe, pas une bash intégrée.
Torkel Bjørnson-Langen
Question canonique pertinente: Pourquoi ne pas utiliser «qui»? Quoi utiliser alors?
Anthony G - justice pour Monica
0

zsh - une coque complète

il y en a beaucoup, en lisant zshcontrib(1)un peut détecter deux versions de jeux autoload-ables tetris(l'autre avec ncurses) zshen concurrence avec emacs, pour compléter (comme décrit).

=

Je voudrais mentionner le =mot clé, qui peut causer une irritation avec curl(les URL ont généralement ?var=valen eux; mais il est unsetopt-able, je pense):

  • q file =less( gentoo) décide deq file $(which less)

= étend le chemin complet de la commande en question.

autres goodies

d'autres choses, hors de l'esprit, sont la bonne invite RPS1=%d(pour afficher $PWDen style), Alt + H( run-helpie. man), Alt + ? ( which-command) vared, et zed( autoloadfonction), comme Emacs 'minibuffer-like Alt + Xpour exécuter des widgets sans les lier, alias global et suffixe, durée d’achèvement de la commande de suivi d’historique étendu -met -regexcorrespondeurs, émulation de shell (par exemple csh, kshavec emulate) et autoload run-helpavec des extraits de fichier pour les éléments intégrés.

des lamentations

Je pense que la plupart des fonctionnalités, si ce n'est toutes, ont été implémentées il y a longtemps, et lors de la lecture du journal des modifications, il n'y a pas de changements majeurs ni d'ajout de nouvelles fonctionnalités, ce qui est très triste (il n'y a plus rien à explorer et à découvrir).

bashsemble être plus distribué dans readline(par opposition à zle) et gnu historydans l'esprit linux; Par exemple, les fonctions readline et les associations de touches peuvent être appliquées globalement (telles que conservées dans ~/.inputrcet /etc/inputrc) si elles ne sont pas écrasées par bash bind.

conclusion

Personnellement, je pense emacs(surtout en ce qui emacs-noxconcerne la perspective (la version actuelle?) Être la source d'inspiration d'un logiciel exceptionnel, comme par exemple, zshet tmuxa très bien fait de donner l'exemple dans une telle implémentation; pour les personnes appréciant sa valeur (au niveau de ne pas avoir besoin / selon le Xserveur). Le shell Unix est assez puissant, et sa continuité et sa cohérence suffisent pour un flux de travail et une productivité appropriés (en informatique globale).

ocodo
la source