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.
En particulier, Zsh apporte les fonctionnalités suivantes :
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.
yaourt -S zsh
zsh
chsh -S /bin/zsh
Le fichier de base : ~/.zshrc En voici un exemple : Chez ubuntu :$
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).
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éfix
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
zsh gère les types MIMES qui permettent d'associer une application a un type de fichier. Il faut obtenir un fichier référencant 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
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
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.
Zsh procède a diverses expansions lorsqu'il parse la commande. Elles sont exécutées linéairement en 5 étapes :
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.
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
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)
${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 ! Meme chose avec % pour “finit par”. Et bien plus ! voir le man pour plus de détails.
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 :
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>
TODO
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 % .. / %