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.

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 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. LOL

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ès scp 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 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ê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 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 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
#!/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 :

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.

  • 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

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
  • zsh.txt
  • Dernière modification: Le 05/04/2020, 20:13
  • (modification externe)