ZSH
Zsh est un interpréteur de commandes (shell), tout comme bash. Il fournit une interface entre l'utilisateur et le système. Il est indispensable d'avoir un interpréteur de commandes pour utiliser un système GNU/Linux (et même tous les autres systèmes). Le shell par défaut dans Ubuntu est bash, c'est un shell qui a bien des avantages (notamment pour les scripts), mais il est assez limité dans certaines fonctionnalités comme l'autocomplétion. Zsh est plutôt orienté pour l'interactivité avec l'utilisateur.
Installation
Utilisation
Vous pouvez le lancer comme ceci :
zsh
Pour définir zsh comme shell par défaut (lorsque vous vous connectez dans un terminal (ou un émulateur de terminal), on peut utiliser l'utilitaire chsh :
chsh
On vous demande quel shell utiliser, répondez /bin/zsh (en toutes lettres).
Puis déconnectez vous et reconnectez vous. Et voilà, vous êtes sur zsh !
Si vous ne possédez pas les droits d'administration sur l'ordinateur que vous utilisez, il vous suffit d'inscrire ceci dans votre fichier ~/.bashrc
exec zsh
Les fichiers de configuration
Les fichiers utilisés pour la configuration sont les suivants :
/etc/zsh/zshrc ## Ce fichier s'applique à tous les utilisateurs du système ~/.zshrc ## Ce fichier s'applique à un utilisateur du système (~ veut dire /home/utilisateur)
Il est possible que les distributions fournissent un /etc/zshrc
donc je vous conseille d'aller voir ce qu'il y a dans ce fichier.
Pour toutes les modifications que vous ferez dans les fichiers de configuration, il faut lancer la commande "source" sur les fichiers que vous avez modifiés pour que ça prenne effet, par exemple :
source ~/.zshrc
Toutes les commandes qui vont être données peuvent être tapées directement dans le shell, mais pour qu'elles prennent effet lors de la connexion au shell il faut les écrire dans un des fichiers de configuration (/etc/zsh/zshrc ou ~/.zshrc)
Pour les feignants, il y a un fichier de configuration tout prêt en fin de page.
Complétion
La complétion sous Zsh est très avancée. Par défaut, vous avez par exemple :
- Complétion sur les noms de domaines. Par exemple, après
ssh <TAB>
, zsh complétera parmi les noms de domaines dans/etc/hosts
,.ssh/
, etc. , et même aprèsscp fichier user@domaine:~/ <TAB>
, zsh complètera par les noms de fichiers sur le serveur
- Complétion après
make
par les cibles possibles du Makefile
- Complétion sur les options des programmes, avec la description de celles-ci. Essayez par exemple
mplayer -v <TAB>
- Complétion sur les pages de manuel
- … et bien d'autres
Ajoutons que cette complétion est entièrement configurable :
Pour activer la complétion :
autoload -U compinit compinit
La complétion est très modifiable. Pour améliorer l'apparence de l'auto complétion :
zstyle ':completion:*:descriptions' format '%U%B%d%b%u' zstyle ':completion:*:warnings' format '%BDésolé, pas de résultats pour : %d%b' zstyle ':completion:*' menu select=2 zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
Pour éviter de proposer un élément déjà présent lors d'un cp, mv ou rm :
zstyle ':completion:*:rm:*' ignore-line yes zstyle ':completion:*:mv:*' ignore-line yes zstyle ':completion:*:cp:*' ignore-line yes
Sur Ubuntu, on utilise souvent sudo
, donc il peut être intéressant d'avoir la complétion lorsque la commande n'est pas dans votre $PATH :
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \ /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
Zsh supporte aussi les fonctions de complétion de bash, pour les utiliser :
autoload -U bashcompinit bashcompinit
Ensuite il suffit de "sourcer" les fichiers de configuration de bash. (/etc/profile
ou ~/.bashrc
)
Zsh peut aussi vous corriger si vous tapez sl
à la place de ls
(sauf si vous avez installé sl )
setopt correctall
Le prompt
Le prompt est ce que vous voyez, par exemple :
vous@machine ~/src %
Ce prompt est contenu dans une (ou plusieurs) variables d'environnements. La plus utilisée est certainement $PS1
Zsh fournit des prompts prêt à l'emploi dans /usr/share/zsh/functions/Prompts. Pour les activer :
autoload -U promptinit promptinit
Vous pouvez avoir une liste des themes comme ceci :
prompt -l
Mais aussi un aperçu de tous les prompts disponibles :
prompt -p
Vous pouvez choisir un prompt comme ceci :
prompt NOM_DU_THEME
Si vous voulez faire votre prompt vous mêmes, voyez cette page : http://www.gentoo.org/doc/fr/zsh.xml#doc_chap2 (lien invalide ?) et cette page : https://wiki.archlinux.org/index.php/zsh
Globbing
La fonctionnalité qui vous fera oublier find
Un exemple :
rm **/*toto*
supprimera tous les fichiers comprenant le mot toto dans le répertoire courant, et ensuite en cherchant récursivement dans tous les sous-dossiers.
Il y a toute une syntaxe pour faire d'autres choses, bien sûr.
ZLE
ZLE désigne la zone dans laquelle vous tapez vos commandes. Vous pouvez utiliser les raccourcis claviers de vi ou d'emacs, au choix, et définir très facilement vos propres raccourcis. En vrac, quelques raccourcis par défaut :
- <Echap>h va appeler la page de manuel du premier mot que vous êtes en train de taper
- <Echap>q va copier la ligne que vous étiez en train de taper en mémoire, pour vous laisser devant une ligne vide. Vous pouvez alors rentrer une nouvelle commande, lorsque celle-ci sera terminée, zsh vous affichera la ligne en mémoire.
Alias
ZSH permet, comme bash, de définir des "alias", c'est à dire des commandes définies à partir d'autres commandes, par exemple :
alias la="ls -a"
Permet de définir une commande 'la' qui seras identique à 'ls -a' (liste les fichiers du répertoire passé en paramètre, en incluant les fichiers cachés).
Pour pouvoir se servir en permanence de ces alias, il faut qu'ils soient inscrits dans le fichier ~/.zshrc.
Alias suffixe
Mais zsh va plus loin en permettant des alias sur les suffixes. L'idée initiale vient du fait que pour certains types de fichiers nous exécutons toujours la même commande. Par exemple, un fichier PDF sera généralement lu avec votre lecteur PDF favori. Passons à la pratique afin d'être plus clair.
alias -s pdf="evince "
Voici la création de l'alias pour tous les fichiers dont le nom est nom.pdf
Ensuite il suffit de l'utiliser comme s'il s'agissait un exécutable.
./fichier.pdf
Cela va lancer evince pour ouvrir votre fichier PDF.
Alias globaux
Zsh permet également de définir des alias "globaux" qui s’exécuteront quelle que soit leur position dans la ligne de commande, ainsi avec l'alias
alias -g G=' | grep '
la commande
ls /bin G zsh
remplacera
ls /bin | grep zsh
Un exemple de fichier zshrc
#!/usr/bin/env zsh # _________ _ _ ____ ____ # |__ / ___|| | | | _ \ / ___| # / /\___ \| |_| | |_) | | # _ / /_ ___) | _ | _ <| |___ #(_)____|____/|_| |_|_| \_\\____| # # Complétion autoload -U compinit compinit zstyle ':completion:*:descriptions' format '%U%B%d%b%u' zstyle ':completion:*:warnings' format '%BSorry, no matches for: %d%b' zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \ /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin # Crée un cache des complétion possibles # très utile pour les complétion qui demandent beaucoup de temps # comme la recherche d'un paquet aptitude install moz<tab> zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh_cache # des couleurs pour la complétion # faites un kill -9 <tab><tab> pour voir :) zmodload zsh/complist setopt extendedglob zstyle ':completion:*:*:kill:*:processes' list-colors "=(#b) #([0-9]#)*=36=31" # Correction des commandes setopt correctall # Un petit prompt sympa autoload -U promptinit promptinit prompt adam2 # Les alias marchent comme sous bash alias ls='ls --color=auto' alias ll='ls --color=auto -lh' alias lll='ls --color=auto -lh | less' # marre de se faire corriger par zsh ;) alias xs='cd' alias sl='ls' # mplayer en plein framme buffer ;) alias mplayerfb='mplayer -vo fbdev -vf scale=1024:768' # Un grep avec des couleurs : export GREP_COLOR=31 alias grep='grep --color=auto' alias xte='nohup xterm &' # xte lancera un xterm qui ne se fermera pas si on ferme le terminal # Pareil pour les variables d'environement : #export http_proxy="http://hostname:8080/" #export HTTP_PROXY=$http_proxy # un VRAI éditeur de texte ;) export EDITOR=/usr/bin/vim
Une configuration avancée
Pour ceux qui ne souhaitent pas se plonger dans les fichiers de configurations de zsh, mais qui souhaitent tout de même avoir une configuration agréable à utiliser, je vous propose la configuration suivante :
wget https://formation-debian.viarezo.fr/fichiers-config/zshrc wget https://formation-debian.viarezo.fr/fichiers-config/zshenv wget https://formation-debian.viarezo.fr/fichiers-config/zlogin wget https://formation-debian.viarezo.fr/fichiers-config/zlogout wget https://formation-debian.viarezo.fr/fichiers-config/dir_colors sudo mv zshrc zshenv zlogin zlogout dir_colors /etc/zsh
Vous aurez un prompt en couleur, des raccourcis clavier similaires à ceux d'Emacs, ainsi qu'à ceux de Vim, et de nombreuses autres possibilités.
Résolution de problèmes
- Les touches home, fin, ctrl+[aerl] et autres ne fonctionnent pas correctement, affichent des caractères bizarre :
peut-être en pensant bien faire, vous avez sélectionné, lors de la configuration initiale, les raccourcis type vi, et trouverez donc certainement dans votre ~/.zshrc la directive bindkey -v. Dans ce cas, essayez de remplacer cette directive par bindkey -e qui correspond aux raccourcis de type emacs et qui devraient restaurer le comportement attendu.
Raccourcis clavier du terminal
Si ça ne résout pas le bug (cf « résolution de problèmes »), insérer les lignes suivantes dans ~/.zshrc :
# Touche de commande bindkey "\e[H" beginning-of-line # Début bindkey "\e[F" end-of-line # Fin bindkey "\e[3~" delete-char bindkey "^R" history-incremental-search-backward # Rechercher
cat -v
et taper sur la touche du clavier désirée pour connaître son bindkey, vous verrez que ce dernier ne correspond pas à ceux listés par :
bindkey
À noter, que vous pouvez directement connaître le bindkey via Vim : passer en mode insertion et taper Ctrl V
Complétion pour la commande killall
Pour ceux qui viennent de bash ils seront dérouté de voir que la commande killall ne propose pas de complétion, ce bogue a été corrigé : zsh's killall process tab completion should match bash's
Pour faire simple, il suffit de rajouter dans le fichier /etc/zsh/zshrc les lignes suivantes :
zstyle ':completion:*:processes' command 'ps -ax' zstyle ':completion:*:processes-names' command 'ps -aeo comm=' zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' zstyle ':completion:*:*:kill:*' menu yes select zstyle ':completion:*:*:killall:*:processes-names' list-colors '=(#b) #([0-9]#)*=0=01;31' zstyle ':completion:*:*:killall:*' menu yes select
Voir aussi
- (en) Guide sur l'installation et la configuration de zsh sur Gentoo.org
Contributeurs : yannick_lm, philpep-tlse, geenux, malko25, david96.