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.
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 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.
La complétion sous Zsh est très avancée. Par défaut, vous avez par exemple :
ssh <TAB>
, zsh complétera parmi les noms de domaines dans /etc/hosts
, .ssh/
, etc. , et même après scp fichier user@domaine:~/ <TAB>
, zsh complètera par les noms de fichiers sur le serveurmake
par les cibles possibles du Makefilemplayer -v <TAB>
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 )
setopt correctall
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 : Arch Linux ZSH
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 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 :
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.
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.
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
#!/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
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.
Vous pouvez utiliser des thèmes de terminal avec Oh my zsh.
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
Contributeurs : yannick_lm, philpep-tlse, geenux, malko25, david96.