Zsh

De ArchwikiFR


Le Z shell ou zsh est un shell Unix qui peut être utilisé de façon interactive, à l'ouverture de la session ou en tant que puissant interpréteur de commande. Zsh peut être vu comme un « Bourne shell » étendu avec beaucoup d'améliorations. Il reprend en plus la plupart des fonctions les plus pratiques de bash, ksh et tcsh.

Fonctionnalités

En particulier, Zsh apporte les fonctionnalités suivantes :

  • Complétion des commandes, des options et des arguments de la plupart des commandes. Par exemple, taper la suite de caractères « cd <TAB> » ne permettra la complétion que par des répertoires.
  • 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.

Zsh supporte l'Unicode depuis peu et s'avère plus flexible et léger que bash, notamment grâce à une découpe du code en modules chargeables dynamiquement.

Source

Installation

pacman -S zsh

Lancement

exec zsh

zsh peut être lancé en temps que login shell avec l'option --login.

Lancement automatique dans les différentes consoles

chsh -s /bin/zsh

Configuration

Le fichier de base : ~/.zshrc En voici un exemple : Chez ubuntu :$

Ajouter les alias ssh, scp, sftp aux concatenations

Méthode native ZSH

Attention : sachez que cette méthode vous rend vulnérable à une propagation d'attaque par "Island Hopping") Dans l'exemple Ubuntu ci-dessus, la ligne autoload -U compinit && compinit permet l'auto-complétion des commandes mais pour que celle-ci fonctionne avec les noms d'hôtes (sous ssh/ftp/scp), encore faut-il que ces noms ne soient pas stockés hashés par le client ssh local dans le ~/.ssh/known_hosts. Pour ce faire il faut donc désactiver la ligne suivante (ou mettre le paramètre à no) dans /etc/ssh/ssh_config :

HashKnownHosts yes

Déplacez ensuite le ~/.ssh/known_hosts ailleurs pour que le client ssh le recréé et cette fois-ci avec les noms en clair (attention vous perdrez vos hôtes connus).

Méthode alternative

Si la méthode native ne fonctionne pas, Wisthler nous a concocté un petit script comme il a fait ca bien y a rien a ajouter ... je le place dans ~/.script/print_hosts.zsh

#!/bin/zsh
# print_hosts.zsh
#
# Auteur : wisthler <wisthler@gmail.com>
# Version : 1.1

# Le but de ce script est de parser le fichier .ssh/config (et à terme
# d'autre fichiers similaires si l'utilité s'en fait sentir) pour en
# extraire les alias faisant référence à des hosts pour pouvoir les
# utiliser pour faire de l'auto-complétion pour la commande ssh et
# toutes celles dérivées de celles-ci comme scp, sftp, sshfs, ...

# On définit un tableau avec les différents fichiers à parser
FICHIERS=( $HOME/.ssh/config )

# On définit un tableau avec les différents préfixs à repérer
PREFIXS=("Host=" "Host ")

# On itère sur les fichiers
for i in $FICHIERS
do
    # On itère sur les préfixes
    for j in $PREFIXS
    do
        # 1/ On affiche le fichier "i"
        # 2/ On récupère les lignes qui match le préfix "j"
        # 3/ On enlève le préfix pour ne garder que le reste de la ligne
        # 4/ On afficher les résultats
        cat $i | grep -i $j | sed "s/$j//i"
    done
done

on ajoute ces deux lignes au .zshrc :

#ssh & co :)
HOSTS=("${(f)$($HOME/.script/print_hosts.zsh)}") # hosts defined by the user like the ones in .ssh/config
zstyle ':completion:*:(ssh|scp|sftp|sshfs):*' hosts $HOSTS

Support des types MIMES

zsh gère les types MIMES qui permettent d'associer une application a un type de fichier. Il faut obtenir un fichier référençant tous les types :/etc/mime.types,et éventuellement ~/.mime.types

pacman -S mime-types

Les associations type-applications sont définies par défaut dans /etc/mailcap et ~/.mailcap. Archlinux ne fournit pas de tels fichiers. Vous pouvez installer celui de Debian qui est dans AUR, toutefois il est aussi possible de créer le sien. Pour faire propre, plaçons le dans /etc/mailcap_perso. Commençons par charger le module zsh utilisé :

autoload -U zsh-mime-setup
autoload -U zsh-mime-handler
zsh-mime-setup

Par la suite rajouter ces lignes au zshrc. Il faut ensuite ajouter ce fichier a la liste des fichiers mailcap de zsh :

zstyle ':mime:*' mailcap /etc/mailcap_perso

Voici un exemple de fichier mailcap personnel simple :

video/*; /usr/bin/mplayer '%s'; needsterminal
text/*; less '%s'; needsterminal
audio/*; /usr/bin/audacious '%s';

On relance, et lancer un fichier audio l'ouvre avec audacious :) :

zsh-mime-setup
./ma_chanson
Astuce: Pour connaitre le type d'un fichier :
file -i mon_fichier

Il est aussi possible d'ajouter manuellement des associations avec les extensions des fichiers :

alias -s txt='less'

ou bien :

zstyle ':mime:.txt:' handler less %s

Fonctionnalités utiles

Zsh est particulièrement pratique pour une utilisation interactive. Nous nous intéressons ici a des fonctionnalités propres a zsh, il n'est pas question de présenter les utilisations classiques d'un shell.

Expansions et substitutions

Zsh procède a diverses expansions lorsqu'il parse la commande. Elles sont exécutées linéairement en 5 étapes :

  1. historique des commandes,
  2. alias,
  3. substitution des commandes et des processus, expansion des expressions mathématiques, des paramètres,
  4. expansion des noms de fichiers,
  5. génération des noms de fichiers, mieux connu sous le nom de "globbing".

Historique des commandes

zsh conserve un historique des commandes. Pour voir les dernières commandes de l'historique :

fc -l

La commande fc ouvre la dernière commande de l'historique dans $EDITOR, pratique pour corriger les commandes multi-lignes. La commande r permet de répéter la dernière commande de l'historique, tout en autorisant des substitutions :

r foo=bar

Le caractère "!" permet l'expansion historique des commandes :

!-2

exécute la commandes en position -2 dans l'historique. Il est aussi possible de fournir la position absolue en argument. Noter qu'il existe d'autes arguments tels que

!str

qui rappelle la première commande commençant par str.

Alias

Outre la gestion habituelle des alias, notons la possibilité de définir des alias globaux, qui sont remplacés a n'importe quel endroit de la ligne :

alias -g M='| more'
commande M

Substitution des processus

Les classiques $(...) et `...` sont bien entendu fonctionnels. La syntaxe =(...) permet de stocker le résultat de la commande dans un fichier :

emacs -nw =(ls -d | grep foo)

Les redirections permettent aussi la substitutions :

paste <(cut -f1 fichier)

Expansion des Paramètres

${nom}

renvoie la valeur du paramètre nom s'il est défini. Il est possible de modifier la valeur de l’expansion du paramètre.

${nom:u}
${nom:l}

change la casse de nom. (uppercase et lowercase)

${nom:s/foo/bar/}

opère la substitution de foo par bar dans nom.

${nom#foo}

si nom commence par foo, alors supprime foo. Utile avec un joker ! Même chose avec % pour "finit par". Et bien plus ! voir le man pour plus de détails.

Génération des noms de fichiers (globbing)

Les syntaxes *,?,[...],[:alpha:] utilisées dans les expressions régulières sont utilisables. Pour pouvoir utiliser les options de filtrage étendues, il faut activer les options :

setopt extendedglob
setopt numericglobsort

Le caractère ^ inverse le filtrage qui suit. x|y correspond a un OU : filtre les expressions correspondant a x ou a y

ls *.(pdf|ps)

x~y correspond a l'opérateur logique ET NON :

ls (*.sh~*foo*)

liste tous les fichiers d'extension .sh ne contenant pas foo. On peut aussi spécifier le type de fichier :

ls *(@)

liste tous les liens. Les options courantes sont :

  • / les répertoires,
  • . les fichiers,
  • x les exécutables par tout le monde, X par l'utilisateur courant,
  • r,R les lisibles,
  • w,W les inscriptibles,
  • s les setuid,
  • S les setgid.

On peut bien entendu combiner ces options :

ls *(x^/)

Les caractères %%**/%% forcent la recherche récursive :

ls **/*(x^/)

Une expression de la forme <x-y> filtre une série d'entiers.

ls foo<10-100>

Les redirections

Il est possible de faire en sorte que zsh n'écrive pas dans un fichier non vide avec >. Cette opération nécessite alors la redirection >|. unsetopt clobber

La pile des répertoires

Zsh maintient un historique des répertoires visités, implémenté sous la forme d'une pile. La commande pushd ajoute le répertoire passé en argument a la pile et change de répertoire. La commande popd retire le dernier répertoire de la pile et change de répertoire. Exemple :

~ % pushd foo/bar
~/foo/bar % popd
~ %
dirs

permet de voir la pile.

cd -n

change le répertoire courant au n-ème répertoire de la pile. Taper le nom d'un répertoire l'ajoute a la pile et change le répertoire courant :

~ % /etc
/etc % ..
/ %

L'option setopt pushd_silent permet de ne pas afficher la pile après pushd ou popd.

Si la commande tapée est invalide mais correspond à un sous répertoire, changer pwd à ce sous-répertoire : setopt auto_cd.