{{tag>console shell }}
----
====== 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 =====
[[:tutoriel:comment_installer_un_paquet|Installez le paquet]] **[[apt>zsh|zsh]]**.
===== 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).
Vérifiez bien votre saisie avant de valider, sinon vous risquez d'avoir un terminal non fonctionnel.
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
Si gnome-terminal ne se lance pas avec zsh et continue de fonctionner avec bash alors il faut aller dans les préférences du profil dans le menu “Édition”.
Cocher “Exécuter une commande personnalisée de mon shell” dans l'onglet “Titre et Commande”. Mettre zsh comme commande personnalisée.
===== 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 '', zsh complétera parmi les noms de domaines dans ''/etc/hosts'', ''.ssh/'', etc. , et même après ''scp fichier user@domaine:~/ '', 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 ''
* 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'' (doc [[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 LOL )
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êts à l'emploi dans /usr/share/zsh/functions/Prompts.
Pour les activer :
autoload -U promptinit
promptinit
Vous pouvez avoir une liste des thèmes 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 : [[https://wiki.archlinux.org/index.php/zsh|Arch Linux ZSH]]
==== Globbing ====
La fonctionnalité qui vous fera oublier [[tutoriel/console_commandes_de_base#find|find]] 8-)
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 [[:Vim]] ou d'[[:Emacs]], au choix, et définir très facilement vos propres raccourcis.
En vrac, quelques raccourcis par défaut :
* h va appeler la page de manuel du premier mot que vous êtes en train de taper
* 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
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh_cache
# des couleurs pour la complétion
# faites un kill -9 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 :
for pkg in zshrc zshenv zlogin zlogout dir_colors ;do sudo wget -cO /etc/zsh/$pkg https://formation-debian.viarezo.fr/fichiers-config/$pkg ;done
sudo cp /etc/zsh/dir_colors /etc/
Vous aurez un prompt en couleur, des raccourcis clavier similaires à ceux d'[[:Emacs]], ainsi qu'à ceux de [[:Vim]], et de nombreuses autres possibilités.
===== Rendre ZSH plus sexy =====
Vous pouvez utiliser des thèmes de terminal avec [[Oh-my-zsh|Oh my zsh]].
===== 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
Astuce, pour connaître les raccourcis clavier de votre terminal, taper la commande :
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
===== Voir aussi =====
* [[Oh-my-zsh|Oh my zsh]]
* **(en)** [[https://wiki.gentoo.org/wiki/Zsh|Guide sur l'installation et la configuration de zsh]] sur Gentoo.org
* **(en)** [[https://zshwiki.org/home/]]
* **(en)** [[https://hackernoon.com/macbook-my-command-line-utilities-f8a121c3b019#.87unujp9a|Description des usages de la commande]]
* **(fr)** [[http://cli.asyd.net/home/shell/zsh/racine]]
----
//Contributeurs : [[:utilisateurs/yannick_lm|yannick_lm]], [[:utilisateurs/philpep-tlse|philpep-tlse]], [[:utilisateurs/geenux|geenux]], [[:utilisateurs/malko25|malko25]], [[:utilisateurs:david96|david96]].//