Découverte de Zsh sur CentOS 5.2
Découvrons dans ce tutoriel ce qu’est Zsh et apprenons à le compiler et le configurer sous une CentOS 5.2
1. Petite présentation
Le Z shell ou zsh est un shell Unix. Il reprend la plupart des fonctions les plus pratiques de bash, ksh ou encore tcsh.
En particulier, Zsh apporte notamment les fonctionnalités suivantes :
- Complétion des commandes, des options et des arguments de la plupart des commandes. En particulier, taper la suite de caractères « cd » ne permettra la complétion que par des répertoires ;
- Recherche dans les sous-répertoire grâce au sélecteur ** ;
- Partage de l’historique des commandes entre tous les shells zsh actuellement actifs ;
- Utilisation améliorée des variables et des tableaux ;
- Édition des commandes multi lignes dans un seul buffer ;
- Correction « orthographique » des commandes tapées
- Plusieurs modes de compatibilité (zsh peut par exemple être vu comme un shell bourne quand il est exécuté en tant que /bin/sh) ;
- Invite de commande personnalisable, avec la possibilité d’afficher des informations sur le côté droit de l’écran qui disparaissent si la commande tapée est trop longue ;
2. Compilation et installation
Plusieurs mirroirs sont disponibles pour récupérer les dernières versions du produit. Ils sont listés sur le site de Zsh : http://www.zsh.org/
Commençons donc ce tutoriel en récupérant la dernière version stable (à cette heure il s’agit de la version 4.2.3) :
cd /usr/local/src/ wget ftp://nephtys.lip6.fr/pub/unix/shells/zsh/zsh.tar.gz tar xvf zsh-4.2.3.tar.gz mv zsh-4.2.3 /opt cd /opt/zsh-4.2.3
On installe un paquet nécessaire à sa compilation :
yum install ncurses-develNous pouvons désormais le compiler :
./configure make make check make install
Par défaut, zsh s’installera dans le /usr/local/bin. Vous pouvez d’ores et déjà le lancer.
3. Une config de base
Le shell Zsh comporte 2 paires de 5 fichiers de configuration. Vous les trouverez la première paire dans le /etc et la seconde dans votre répertoire personnel /home. Comme tous les shells, les fichiers de configuration globale (dans le /etc) seront lus en premier suivi par la lecture de vos fichiers personnels (dans le /home).
Chronologiquement à leur ordre de lecture, ces fichiers sont :
- zshenv et .zshenv : contient l’ensemble des variables d’environnement ;
- zprofile et .zprofile : est lu uniquement dans le cas d’un login shell ;
- zshrc et .zshrc : (est lu uniquement dans le cas d’un interactive shell), il contient les aliases, les options (setopt), les fonctions, les zstyles… ;
- zlogin et .zlogin : (est lu uniquement dans le cas d’un login shell), on y place des commandes à exécuter avant la session ;
- En fermant votre shell les fichiers .zlogout et zlogout sont lus dans l’ordre respectif (fichier utilisateur puis global).
Apprenons désormais à configurer un minimum Zsh pour le rendre convivial et surtout pour profiter de son extrême efficacité et utilité
Voici donc quelques fichiers de configuration prêt à l’emploi.
Je tiens d’ailleurs à préciser que ces fichiers proviennent du site http://formation-debian.via.ecp.fr/ et ont été légèrement modifiés. Je remercie la personne qui me l’a appris, même si la forme de sa remarque était autant inappropriée que stupide et qu’il n’a manifestement pas le goût de la présomption d’innocence…
zshenv
# Formation Debian GNU/Linux par Alexis de Lattre # http://formation-debian.via.ecp.fr/ # Modifié par le blog Actinux # Le PATH = un ensemble de répertoires dans lequel le shell va chercher les commandes (on les sépare par des ':') export PATH="/usr/local/bin:/usr/local/sbin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/sbin:$HOME/bin" # Viewer/Editeur par défaut (pour Crontab, CVS,...) export VISUAL=vim export EDITOR=vim # Permissions rw-r--r-- pour les fichiers crées # et rwxr-xr-x pour les répertoires crées umask 022 # Proxy HTTP / FTP sans mot de passe #export http_proxy="http://proxy.exemple.org:8080" #export ftp_proxy="ftp://proxy.exemple.org:8080" # Proxy HTTP / FTP avec mot de passe #export http_proxy="http://login:password@proxy.exemple.org:8080" #export ftp_proxy="ftp://login:password@proxy.exemple.org:8080" # Ne pas passer par le proxy pour les domaines locaux #export no_proxy="exemple.org" # De la couleur pour grep export GREP_OPTIONS='--color=auto'
zshlogin
# Formation Debian GNU/Linux par Alexis de Lattre # http://formation-debian.via.ecp.fr/ # Modifié par le blog Actinux # Ce fichier contient les commandes qui s'exécutent quand l'utilisateur # Ouvre une console # Affiche des informations sur le système uname -a uptime # Accepte les messages d'autres utilisateurs mesg y
zshlogout
# Formation Debian GNU/Linux par Alexis de Lattre # http://formation-debian.via.ecp.fr/ # Modifié par le blog Actinux # Ce fichier contient les commandes qui s'exécutent quand l'utilisateur # Ferme une console # Nettoie l'écran clear
zshrc
# Formation Debian GNU/Linux par Alexis de Lattre # http://formation-debian.via.ecp.fr/ # Modifié par le blog Actinux # # 1. Les alias # # Gestion du ls : couleur + touche pas aux accents alias ls='ls --classify --tabsize=0 --literal --color=auto --show-control-chars --human-readable' # Gestion du grep : couleur alias grep='grep --color=auto' # Demande confirmation avant d'écraser un fichier alias cp='cp --interactive' alias mv='mv --interactive' alias rm='rm --interactive' # Raccourcis pour 'ls' alias ll='ls -l' alias la='ls -la' # Quelques alias pratiques alias c='clear' alias less='less --quiet' alias s='cd ..' alias df='df --human-readable' alias du='du --human-readable' # # 2. Prompt et définition des touches # if [ "$TERM" = "linux" -o "$TERM" = "screen" -o "$TERM" = "screen-w" ] then bindkey '^[[1~' beginning-of-line # Home bindkey '^[[4~' end-of-line # End bindkey '^[[3~' delete-char # Del bindkey '^[[2~' overwrite-mode # Insert bindkey '^[[5~' history-search-backward # PgUp bindkey '^[[6~' history-search-forward # PgDn fi if [ "$TERM" = "xterm" -o "$TERM" = "xterm-color" -o "$TERM" = "xterm-debian" ] then if [ "$COLORTERM" != "" -a "$UNAME" = "Linux" ] then export TERM=xterm-debian fi bindkey '^[[H' beginning-of-line # Home bindkey '^[[F' end-of-line # End bindkey '^[[3~' delete-char # Del bindkey '^[[2~' overwrite-mode # Insert bindkey '^[[5~' history-search-backward # PgUp bindkey '^[[6~' history-search-forward # PgDn fi if [ "$TERM" = "rxvt" ] then export TERM="xterm" bindkey '^[[1~' beginning-of-line # Home bindkey '^[[4~' end-of-line # End bindkey '^[[3~' delete-char # Del bindkey '^[[2~' overwrite-mode # Insert bindkey '^[[5~' history-search-backward # PgUp bindkey '^[[6~' history-search-forward # PgDn echo -en '\033>' fi if [ "$TERM" = "vt100" ] then bindkey '^[OA' up-line-or-history # Fleche haut bindkey '^[OB' down-line-or-history # Fleche bas bindkey '^[OC' forward-char # Fleche droite bindkey '^[OD' backward-char # Fleche gauche bindkey '^?' delete-char # Del fi # On définit ici les couleurs du term pour le root ou les utilisateurs BLACK="%{"$'\033[01;30m'"%}" GREEN="%{"$'\033[01;32m'"%}" RED="%{"$'\033[01;31m'"%}" YELLOW="%{"$'\033[01;33m'"%}" CYAN="%{"$'\033[36;1m'"%}" BLUE="%{"$'\033[01;34m'"%}" BOLD="%{"$'\033[01;39m'"%}" NORM="%{"$'\033[00m'"%}" WHITE="%{"$'\033[37;1m'"%}" if [ "`id -u`" -eq 0 ]; then export PS1="${CYAN}%T ${BLUE}%n${YELLOW}@${WHITE}%m ${GREEN}%~${YELLOW} # ${NORM}${BOLD}" else export PS1="${CYAN}%T ${RED}%n${YELLOW}@${WHITE}%m ${GREEN}%~${YELLOW} $ ${NORM}${BOLD}" fi # Gestion de la couleur pour 'ls' (exportation de LS_COLORS) if [ -x /usr/bin/dircolors ] then if [ -r ~/.dir_colors ] then eval "`dircolors ~/.dir_colors`" elif [ -r /etc/dir_colors ] then eval "`dircolors /etc/dir_colors`" else eval "`dircolors`" fi fi # # 3. Options de zsh (cf 'man zshoptions') # # Je ne veux JAMAIS de beeps unsetopt beep unsetopt hist_beep unsetopt list_beep # >| doit etre utilise pour pouvoir ecraser un fichier déjà éxistant ; # le fichier ne sera pas écrasé avec '>' unsetopt clobber # Ctrl+D est équivalent a 'logout' unsetopt ignore_eof # Affiche le code de sortie si different de '0' setopt print_exit_value # Demande confirmation pour 'rm *' unsetopt rm_star_silent # Correction orthographique des commandes setopt correct # Si on utilise des jokers dans une liste d'arguments, retire les jokers # qui ne correspondent a rien au lieu de donner une erreur setopt nullglob # Schémas de completion # - Schéma A : # 1ere tabulation : complète jusqu'au bout de la partie commune # 2eme tabulation : propose une liste de choix # 3eme tabulation : complète avec le 1er item de la liste # 4eme tabulation : complète avec le 2eme item de la liste, etc... # -> c'est le schema de complétion par défaut de zsh. # Schema B : # 1ere tabulation : propose une liste de choix et complète avec le 1er item # de la liste # 2eme tabulation : complète avec le 2eme item de la liste, etc... # Si vous voulez ce schéma, décommentez la ligne suivante : #setopt menu_complete # Schema C : # 1ere tabulation : complète jusqu'au bout de la partie commune et # propose une liste de choix # 2eme tabulation : complète avec le 1er item de la liste # 3eme tabulation : complète avec le 2eme item de la liste, etc... # Ce schema est le meilleur a mon gout ! # Si vous voulez ce schema, décommentez la ligne suivante : #unsetopt list_ambiguous # Options de complétion # Quand le dernier caractère d'une complétion est '/' et que l'on # tape 'espace' après, le '/' est effacé setopt auto_remove_slash # Ne fait pas de complétion sur les fichiers et répertoires cachés unsetopt glob_dots # Traite les liens symboliques comme il faut setopt chase_links # Quand l'utilisateur commence sa commande par '!' pour faire de la # complétion historique, il n'execute pas la commande immédiatement # mais il écrit la commande dans le prompt setopt hist_verify # Si la commande est invalide mais correspond au nom d'un sous-répertoire # éxecuter 'cd sous-repertoire' setopt auto_cd # L'execution de "cd" met le repertoire d'ou l'on vient sur la pile setopt auto_pushd # Ignore les doublons dans la pile setopt pushd_ignore_dups # N'affiche pas la pile apres un "pushd" ou "popd" setopt pushd_silent # "pushd" sans argument = "pushd $HOME" setopt pushd_to_home # Les jobs qui tournent en tache de fond sont nice a '0' unsetopt bg_nice # N'envoie pas de "HUP" aux jobs qui tournent quand le shell se ferme unsetopt hup # # 4. Paramètres de l'historique des commandes # # Nombre d'entrées dans l'historique export HISTORY=1000 export SAVEHIST=1000 # Fichier où est stocké l'historique export HISTFILE=$HOME/.zsh_history # Ajoute l'historique à la fin de l'ancien fichier setopt append_history # Chaque ligne est ajoutée dans l'historique à mesure qu'elle est tapée setopt inc_append_history # Ne stocke pas une ligne dans l'historique si elle est identique à la précédente unsetopt hist_ignore_dups # Supprime les répétitions dans le fichier d'historique, ne conservant que la dernière occurrence ajoutée unsetopt hist_ignore_all_dups # Supprime les répétitions dans l'historique lorsqu'il est plein, mais pas avant unsetopt hist_expire_dups_first # N'enregistre pas plus d'une fois une même ligne, quelles que soient les options fixées pour la session courante #setopt hist_save_no_dups # La recherche dans l'historique avec l'éditeur de commandes de zsh ne # montre pas une même ligne plus d'une fois, meme si elle a été # enregistrée unsetopt hist_find_no_dups # # 5. Complétion des options des commandes # zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' zstyle ':completion:*' max-errors 3 numeric zstyle ':completion:*' use-compctl false autoload -U compinit compinit
Je reviendrai plus en détail sur ces fichiers de configuration lors d’un prochain tutoriel.
merci beaucoup pour cet article!