Accueil > Tutos > Découverte de Zsh sur CentOS 5.2

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-devel

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

ati Tutos , , , , ,

  1. Oliv
    05/04/2009 à 20:18 | #1

    merci beaucoup pour cet article!

  1. Pas encore de trackbacks