Zsh (Français)
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 prends en charge 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
Installer le paquet zsh
Lancement
exec zsh
zsh peut être lancé en tant 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 :$
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
Gestion 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
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
Raccourcis clavier
Zsh n'utilise pas readline, mais son propre éditeur de ligne Zsh (ZLE), plus puissant. Il ne lit pas /etc/inputrc
ou ~/.inputrc
. Lisez A closer look at the zsh line editor and creating custom widgets pour une introduction à la configuration de ZLE.
ZLE possède un mode Emacs et un mode vi (Français). Si la variable d'environnement VISUAL
ou EDITOR
contient la chaîne vi
, le mode vi sera utilisé ; sinon, le mode Emacs sera utilisé par défaut. Définissez explicitement le mode avec bindkey -e
ou bindkey -v
respectivement pour le mode Emacs ou le mode vi.
Les raccourcis clavier sont assignées en associant une séquence d'échappement correspondant à une pression sur une touche à un widget ZLE. Les widgets disponibles, avec la description de leurs actions et de leurs raccourcis clavier par défaut, sont listés dans et .
La manière recommandée de définir les raccourcis clavier dans Zsh est d'utiliser les capacités de chaînes de caractères de terminfo(5). Par exemple :
{{hc|~/.zshrc|2=
- create a zkbd compatible hash;
- to add other keys to this hash, see: man 5 terminfo
typeset -g -A key
key[Home]="${terminfo[khome]}" key[End]="${terminfo[kend]}" key[Insert]="${terminfo[kich1]}" key[Backspace]="${terminfo[kbs]}" key[Delete]="${terminfo[kdch1]}" key[Up]="${terminfo[kcuu1]}" key[Down]="${terminfo[kcud1]}" key[Left]="${terminfo[kcub1]}" key[Right]="${terminfo[kcuf1]}" key[PageUp]="${terminfo[kpp]}" key[PageDown]="${terminfo[knp]}" key[Shift-Tab]="${terminfo[kcbt]}"
- setup key accordingly
[[ -n "${key[Home]}" ]] && bindkey -- "${key[Home]}" beginning-of-line [[ -n "${key[End]}" ]] && bindkey -- "${key[End]}" end-of-line [[ -n "${key[Insert]}" ]] && bindkey -- "${key[Insert]}" overwrite-mode [[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}" backward-delete-char [[ -n "${key[Delete]}" ]] && bindkey -- "${key[Delete]}" delete-char [[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-history [[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-history [[ -n "${key[Left]}" ]] && bindkey -- "${key[Left]}" backward-char [[ -n "${key[Right]}" ]] && bindkey -- "${key[Right]}" forward-char [[ -n "${key[PageUp]}" ]] && bindkey -- "${key[PageUp]}" beginning-of-buffer-or-history [[ -n "${key[PageDown]}" ]] && bindkey -- "${key[PageDown]}" end-of-buffer-or-history [[ -n "${key[Shift-Tab]}" ]] && bindkey -- "${key[Shift-Tab]}" reverse-menu-complete
- Finally, make sure the terminal is in application mode, when zle is
- active. Only then are the values from $terminfo valid.
if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then autoload -Uz add-zle-hook-widget function zle_application_mode_start { echoti smkx } function zle_application_mode_stop { echoti rmkx } add-zle-hook-widget -Uz zle-line-init zle_application_mode_start add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop fi }}
Recherche dans l'historique
Vous devez configurer le tableau key
et vous assurer que ZLE passe en mode application pour utiliser les instructions suivantes ; voir #Raccourcis clavier.
Pour activer la recherche dans l'historique, ajoutez les lignes suivantes au fichier :
{{hc|~/.zshrc| autoload -Uz up-line-or-beginning-search down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search
[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-beginning-search [[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search }}
En faisant cela, seules les commandes passées correspondant à la ligne actuelle jusqu'à la position actuelle du curseur seront affichées lorsque les touches ou sont pressées.
Modificateurs Shift, Alt, Ctrl et Meta
Les terminaux compatibles xterm peuvent utiliser les définitions de touches étendues de . Il s'agit de combinaisons de , , et avec , , , Right
, PageUp
, , , ou . Consultez le site zkbd source pour obtenir une liste des noms recommandés pour les touches de modification et les combinaisons de touches.
Par exemple, pour déplacer au début du mot précédent et Ctrl+Droit
déplacer au début du mot suivant :
{{hc|~/.zshrc|2= key[Control-Left]="${terminfo[kLFT5]}" key[Control-Right]="${terminfo[kRIT5]}"
[[ -n "${key[Control-Left]}" ]] && bindkey -- "${key[Control-Left]}" backward-word [[ -n "${key[Control-Right]}" ]] && bindkey -- "${key[Control-Right]}" forward-word }}
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 :
- historique des commandes,
- alias,
- substitution des commandes et des processus, expansion des expressions mathématiques, des paramètres,
- expansion des noms de fichiers,
- 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 >|.
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 permet de ne pas afficher la pile après ou popd
.
Si la commande tapée est invalide mais correspond à un sous répertoire, changer à ce sous-répertoire : .
Extensions
Oh-my-zsh
Oh-My-Zsh est un framework open source géré par la communauté pour configurer Zsh.
Installation
Installez le paquet disponible sur AUR.
Configuration
#------------------------------------------------------------------------------- # Oh-My-Zsh #------------------------------------------------------------------------------- ZSH='/usr/share/oh-my-zsh' ZSH_THEME='alanpeabody' ZSH_CACHE_DIR="$HOME/.zsh_cache" DISABLE_AUTO_UPDATE='true' DISABLE_LS_COLORS='false' plugins=( #'plugin1' #'plugin2' #'...' ) source "$ZSH/oh-my-zsh.sh"
Variables de configuration disponibles :
less /usr/share/oh-my-zsh/zshrc
Liste des plugins disponibles :
ls /usr/share/oh-my-zsh/plugins
Zaw
Zaw crée automatiquement des sources (e.g: historique, alias, applications...).
Ces sources sont accessibles via des raccourcis, il est ensuite possible d'appliquer un filtrage et d'effectuer une sélection.
Installation
Installez le paquet disponible sur AUR.
Configuration
#------------------------------------------------------------------------------- # Zaw #------------------------------------------------------------------------------- source '/usr/share/zaw/zaw.zsh' # Exemple de raccourcis bindkey '^A' zaw-applications # Ctrl-A bindkey '^R' zaw-history # Ctrl-R bindkey '^X' zaw # Ctrl-X
Liste des sources disponibles :
zaw-print-src
Zsh-Syntax-Highlighting
Zsh-Syntax-Highlighting, coloration syntaxique pour Zsh.
Installation
Installez le paquet zsh-syntax-highlighting.
Configuration
#------------------------------------------------------------------------------- # Zsh-Syntax-highlighting #------------------------------------------------------------------------------- source '/usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh'