Le shell interactif : zsh.
Cet article a été publié par Xenom
le 05-05-09 à 08:02 dans la catégorie Logiciels
Tags :
- CLI
- Libre
- Ubuntu
zsh est un interpréteur de commande (un shell). Il a été écrit par Paul Falstad en 1990.
J'en ai souvent entendu parler, mais je ne m'y suis jamais mis,
continuant à utiliser bash(qui est d'ailleurs le shell par défaut de
beaucoup de distributions) par habitude. Mais j'ai commencé à utiliser
zsh en stage et il m'a vraiment conquis. Je vais vous présenter ce qui
ma principalement plu dans zsh et comment le configurer.

1 Installation.
L'installation se fait par paquet pour toutes les distributions. Par exemple, pour Ubuntu : apt-get install zsh.
Après l'installation, lors du premier lancement de zsh, vous aurez un menu. Il permet de créer un fichier zshrc (le fichier de configuration de zsh) minimal. Vous pouvez aussi choisir de ne pas le créer, ou créer un fichier vide (évitant ainsi le menu à chaque démarrage). Je vous conseille bien sur de faire la configuration, même si par la suite vous allez surement modifier ce fichier, cela fait un bon début quand même.
Pour utiliser zsh comme shell par défaut il y a la commande chsh.
Cette commande vous demandera le shell à utiliser, répondez /bin/zsh.
Vous pouvez aussi modifier le fichier /etc/passwd, et remplacer votre shell (à la fin de la ligne) par /bin/zsh.
2 Pourquoi zsh ?:
1. Complétion très performante.
La complétion (votre shell complète la commande lorsque vous appuyez sur <Tab>) est puissante, plus que sous bash.
Par exemple, si vous utilisez la complétion après la commande "cd", zsh ne vous proposera que des nom de répertoires. Ou après ssh il vous proposera les hôtes qui sont stockés dans /etc/hosts. La complétion se fait aussi sur les options des programmes, des pages de man,...
La complétion est en plus entièrement configurable avec "compinit"
2. Correction des commandes tapées :
zsh permet la correction des commandes tapées.
Exemple :[xenom@myhost ~]% nanp .zshrc (21:34)
zsh: correct 'nanp' to 'nano' [nyae]?
nyae pour non/oui/annuler/éditer. Non exécute la commande sans correction, oui exécute la commande corrigée, annuler reviens sur un prompt vide et éditer sur le prompt avec la commande.
3. Le prompt
L'invite de commande est personnalisable, et il est possible d'avoir une invite à droite de l'écran, qui disparaît si la commande est longue.
Les variables sont PS1 et RPS1. Elles se configurent sur le même principe que bash, mais la syntaxe est différente.
Quelques variables :
%T Heure système (HH:MM).
%* Heure système (HH:MM:SS).
%D Date système (YY-MM-DD).
%n Nom d'utilisateur.
%B - %b Balises de début - fin de l'affichage en gras.
%U - %u Balises de début - fin de l'affichage souligné.
%d Répertoire de travail courant long.
%~ Répertoire de travail courant relatif à ~.
%M Nom d'hôte de l'ordinateur.
%m Nom d'hôte jusqu'au premier ".".
%# # si utilisateur root, % sinon.
La liste : http://zsh.sunsite.dk/Doc/Release/zsh_12.html#SEC40
4. le globbing
Le "globbing" est l'application d'un motif sur une liste, c'est l'usage des expressions régulières en fait.
zsh permet une utilisation assez poussée : par exemple "**" permet de rechercher dans les sous repertoires.
ls *(sh|py) liste les fichier/dossiers finissant par "sh" ou "py".
zsh permet aussi une recherche par type de fichier :
Fichier : .
Fichier lisible : r
Fichier inscrivable : w
Exécutable : x
Répertoire : /
Lien symbolique : @
Pour des infos plus détaillés il y a le man zshexpn
5. Les options.
Les options de zsh sont activables/désactivables grâce aux commandes setopt/unsetopt. Pour avoir la liste des options, faites <Tab> apres setopt, grace à l'autocomplétion de zsh vous pourez voir les options disponibles.
Il y deux avantages, vous avez le choix de celles que vous voulez utiliser et pas, et aussi un shell leger, car ne sont actives que celles qui sont utilisées.
En voici quelques unes :
always_to_end : si la complétion est réalisé au milieu d'une commande, le curseur revient à la fin.
autocd : cd automatique, permet de changer de répertoire sans indiquer cd.
beep : bip système.
correct : correction "orthographique" des commandes.
hist_verify : Quand la commande commence par "!" pour utiliser l'historique, zsh affiche la commande dans le prompt sans l'executer.
hist_ignore_dumps : ne pas écrire les doublons dans l'historique.
Liste complete : man zshoptions
ou http://zsh.dotsrc.org/Doc/Release/zsh_27.html
6. Les alias.
Il est bien sur possible d'utiliser des alias. Mais zsh permet d'utiliser des alias sur les suffixes. Cela permet d'utiliser son application/commande favorite pour un type de fichier.
Exemples : alias -s sh="nano"
alias -s jpeg="gpicview"
Avec ces alias, si je fait script.sh, il sera automatiquement ouvert avec nano.
3 Configuration :
Il y a deux fichiers de configuration principaux :
zshrc et zshenv.
zshrc est le fichier de configuration principal de zsh, il contient les options, les alias, les fonctions,...
Un exemple (très simple):
zstyle :compinstall filename '/home/xenom/.zshrc'
autoload -Uz compinit promptinit
compinit
promptinit
# Options
setopt correct
setopt hist_verify
setopt nobeep
setopt HIST_IGNORE_DUPS
# Alias
alias ls='ls --color=auto'
alias halt='sudo halt'
alias reboot='sudo reboot'
# Raccourcis clavier
# Redefini Del & Ins
bindkey '^[[3~' delete-char
bindkey '^[[2~' overwrite-mode
bindkey -e
zshenv contient les variables d'environnement (elles peuvent etre aussi etre dans zshrc)
Un exemple :
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
PS1="[%n@%M %~]%# "
RPS1="%{"$'\033[01;34m'"%}(%T)%{"$'\033[00m'"%}
Il reste encore beaucoup d'options et beaucoup à dire, ceci n'est qu'un aperçu des fonctions de zsh qui m'ont intéressées dès le début , je vous conseille d'aller faire un tour dans les pages de man et sur internet pour trouver toutes les options qui vous sont utiles ;).



Commentaires
Concrétement à part le globbing (qui se remplace avantageusement par une bonne connaissance de la commande find) tout est possible également avec bash et un bashrc approprié.
J'ai lu avec intérêt ton post, cependant j'ai trouvé quelques trucs dont tu "vantes" les mérites qui existent également sous bash.
-Le cd <TAB> qui ne propose que des répertoires
-ls *(py|sh) //zsh --> ls {py,sh} //bash
La correction des commandes tapées, cela peut-être pratique, bon perso, j'évite le problème en fessant un alias des commandes sur lesquelles je me trompe dans mon .bash_aliases ^^. Cependant, je pense que ça m'énerverait vite si il me pose la question à chaque fois que je veux faire une commande qu'il ne connaît pas, mais c'est certainement paramétrable.
+1 pour le prompt à droite. Y mettre l'heure permet de voir combien de temps à durée la commande par exemple
Pour les options, je les ai également avec bash, juste que je n'ai que la liste, pas leur définition. (paramétrable??? -> pi-être ^^)
Pour les alias, je n'ai pas trop creusé l'intérêt.
Tu peux rajouté une chose utile, le fait de faire "ESC" + H quand tu tapes une commande te met directement dans le man de cette commande. Cela te permet par exemple de retrouver les options que tu as oublié. Une fois que tu ressort, tu te retrouve toujours dans la commande. C'est peut-être paramétrable avec bash, pas essayer.
C'est à mon avis un bon article, mais un petit manque de trucs bien accrocheur pour faire le saut de bash à zsh. Cela ne reste que mon avis ;)
A bon entendeur, bon boulot tout de même =)
Le globbing permet de ne pas utiliser find à des endroits où ça peut être risqué par exemple dans une boucle for. Avec find on est obligé soit de passer par un processus en plus, pour passer tout les fichiers à un programme. Pour moi find et les globbing sont complémentaire.
@petou et Gardouille :
- Le globbing a pour but de ne pas utiliser find justement, surtout dans des simples commandes, cela est plus rapide et pratique. (d'ailleurs la version 4 de bash la gere aussi, mais il y a encore un peu le temps avant de la voir integrée). Et il est plus poussée que sous bash (je ne crois pas qu'avec bash il soit possible de faire une recherche sur juste les fichiers ou lien symbolyque)
- La completion : bash ne le gere que pour cd, ou alors il faut définir les paramètres de complétion à la main. zsh la gere pour beaucoup de commande (ssh, man, vim, meme les options des commandes!). En plus zsh affiche directement les résultat possibles si il y en a plusieurs apres le premier appui sur Tab et en dessous de la ligne de commande, mais ne les garde pas sur l'affichage apres l'execution de la commande, contrairement à bash. Il est meme possible d'avoir un menu dirigeable avec les fleches pour les resultat de l'autocompletion.
- La correction des commandes : oui un alias est pratique sur les erreurs courantes, mais pas sur toutes, ni sur les noms de fichiers. Tu peux le desactiver si ca t'enerve, et c'est rare de taper des commandes que ton shell ne connait pas mais qui existent.
- Il y a bien des options dans bash, mais moins que zsh.
- Les alias (sur suffixe) comme pour les alias normaux cela permet de gagner du temps et d'avoir moins à taper ;).
Merci pour l'astuce de "ESC" + H et les remarques.
Comme je l'ai mis à la fin, ce n'est vraiment qu'un petit appercu des fonctions de zsh (je n'ai meme pas parler de zstyle), et zsh meritera surement d'autres articles plus approfondis, mais ce sont ces options qui m'ont plus au début, et qui me facilite la vie tous les jours.
Zsh rules!
La complétion dans Zsh est plus intéressante que dans Bash : Les possibilités s'affichent en-dessous de la ligne de commande, et disparaissent une fois la complétion terminée (ou sont remplacées par d'autres possibilités) et ne remplissent pas inutilement l'écran au fur et à mesure comme c'est le cas avec Bash.
Vraiment intéressant! Mais perso je préfère rester sur bash pour pouvoir utiliser de la même manière les pc à l'unnif ou ceux de mes potes sans rien installer, par contre le raccourci pour afficher la man page me botte bien, un moyen d'implémenter ça dans le bashrc?
C'est vrai que c'est bien zsh, mais ça ne fonctionne pas avec Tilda et c'est bien dommage ...
Impossible de s'en passer.
Ne serait ce que pour sa sublime autocomplétion.
En effet, Tilda n'est pas compatible avec Zsh, c'est vraiment dommage :(
Le must serait Tilda avec Zsh et Terminator !!
Super content de voir un article sur zsh !!!
J'utilise ce shell génial depuis l'époque de ma debian woody (spéciale dédicace à Alexis et sa "formation debian", mes fichiers de config sont toujours de cette époque !).
Pour les flemmards :
sudo apt-get install zsh
cd /etc/zsh
sudo wget http://frans-web.com/planque/zsh.tgz
sudo tar xzvf zsh.tgz
sudo rm zsh.tgz
zsh
Ce que j'adore le plus c'est bien sûr la complétion ! Essayez ces petits exemples:
sudo apt-get remove (ou install) <TAB> --> affiche les paquets installés !
chown <TAB> --> affiche les utilisateurs ^^
cp -<TAB> --> affiche les options :D
Bref c'est génial !
Merci de faire le promo pour ce shell !!!
« Ce que j'adore le plus c'est bien sûr la complétion ! Essayez ces petits exemples:
sudo apt-get remove (ou install) <TAB> --> affiche les paquets installés !
chown <TAB> --> affiche les utilisateurs ^^
cp -<TAB> --> affiche les options :D »
Pareil chez moi, sous Bash… Il suffit d'ajouter ça à la fin de son .bashrc :
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
À vrai dire j'ai tellement l'habitude de m'en servir que je suis un peu perdu quand ça marche pas (typiquement, sous Solaris). C'est aussi la raison pour laquelle j'hésite un peu à changer de shell, je préfère encore avoir (plus ou moins) le même partout. Par ailleurs je me méfie également des problèmes de compatibilité…
Tout ce qui est cité ici existe aussi dans bash.
Meme la proprosition de "correction orthographique" des commandes.
@Frans : Merci pour tes fichiers de conf. :)
@Lord Farquaad : ayant beaucoup utilisé bash et utilisant actuellement zsh, je peux quand meme te dire qu'elle est moins performante sous bash, et comme dit Evildead la completion s'affiche en dessous et disparait, et il n'y a pas de menu, et la possibilité de trier par type de fichier sous bash. Mais c'est vrai que c'est pas forcement facile de changer de shell quand ou est habitué, mais la ca vaut le coup, surtout si tu l'utilise regulierement. Zsh a un mode de compatibilité pour beaucoup (voir presque tous ou tous) les shells existant. Je n'ai pour l'instant eu aucun probleme avec tous les scripts bash que j'ai lancé.
@Pingoomax : Il n'y a pas de RPS1, d'alias -s, de verification de l'historique, d'historique partagé dans bash par exemple. Pour la correction orthographique comment l'active ton? La seule option que j'ai est "cdspell", et ne corrige que cd et sans demander si je veux vraiment corriger...
J'utilise Zsh sous tilda depuis bientot 1 an et demi...
@paradoxx_zero : Et comment as-tu fait pour l'intégrer à Tilda ?
Si ca marche pas avec tilda ca peut peut-être marcher avec YaKuake (qui fait quasiment la même chose) ?
Sinon au niveau des scripts zsh, est-ce qu'on retrouve les mêmes fonctions (genre getopt) ??
En fait c'est un shell qui me tente réellement mais j'ai peur de perdre trop de temps vu les avantages...
Oui on retrouve les meme fonctions, de toute facon zsh inclut un mode de compatibilité avec la plupart (tous?) les shells. J'ecrit et utilise encore mes scripts en bash.
Je te conseille d'essayer, de toute facon tu ne perdra pas de temps, il n'y a pas beaucoup de changement(au sens choses modifiées), juste des options en plus, et quand tu as le temps tu peux rajouter des options. Je te conseille de d'abord utiliser un fichier de conf comme celui proposé par Frans dans son commentaire, et le modifier pour ajouter/enlever des options,... des que tu a le temps.
Tilda n'est pas particulièrement bon, Guake dans son genre est mieux (c'est un avis personnel, j'ai utilisé les deux). Yakuake est pour KDE, Guake est son équivalent Gnome (ce que n'est pas vraiment Tilda).
Sinon je viens juste de passer sous Zsh, et mes petites configurations ont été migrées avec très peu d'efforts. Le seul truc à vraiment changer à été le prompt, et bien sûr mes répertoires entremêlés et tous les liens symboliques vers les bons fichiers ! =D
Les complétions Bash ne sont pas du tout parfaites, je ne compte plus les erreurs sed affichées sur SSH, alors que Zsh me propose les noms d'utilisateurs ! Bash sans modification ne me renvoie pas ces erreurs.
Par contre deux petits points négatifs :
- mauvaise gestion du suppr. par défaut (merci à ce billet pour le bindkey approprié ^^)
- pas facile de mettre un saut de ligne dans le prompt (il faut mettre $'\n' hors de tout quote pour ceux que ça intéresse)