Deprecated: Assigning the return value of new by reference is deprecated in /srv/www/u-classroom.net/wiki/inc/parserutils.php on line 208

Deprecated: Assigning the return value of new by reference is deprecated in /srv/www/u-classroom.net/wiki/inc/parserutils.php on line 211

Deprecated: Assigning the return value of new by reference is deprecated in /srv/www/u-classroom.net/wiki/inc/parserutils.php on line 421

Deprecated: Assigning the return value of new by reference is deprecated in /srv/www/u-classroom.net/wiki/inc/parserutils.php on line 594

Deprecated: Function split() is deprecated in /srv/www/u-classroom.net/wiki/inc/auth.php on line 154

Warning: Cannot modify header information - headers already sent by (output started at /srv/www/u-classroom.net/wiki/inc/parserutils.php:208) in /srv/www/u-classroom.net/wiki/inc/auth.php on line 245

Warning: Cannot modify header information - headers already sent by (output started at /srv/www/u-classroom.net/wiki/inc/parserutils.php:208) in /srv/www/u-classroom.net/wiki/inc/actions.php on line 370

Warning: Cannot modify header information - headers already sent by (output started at /srv/www/u-classroom.net/wiki/inc/parserutils.php:208) in /srv/www/u-classroom.net/wiki/inc/actions.php on line 374
====== ZSH ====== ===== Introduction ===== Zsh a été commencé en 90 par Paul Falstad, il était étudiant a Princeton... Un de ses profs s'appelait Zhong Shao, sur le LAN de l'université, son login était un zsh. l'histoire pouvait commencer... * vous utilisez la ligne de commandes perdez parfois du temps avec la ligne de commande * un clavier avec une touche tabulation en bon état * un paquet de kleenex (si vous ne connaissez pas encore zsh vous en aurez besoin) === Prérequis === * zsh (sous ce nom parmi les paquets ubuntu) * subversion, pour récuperer la config de asyd * optionel: les versions GNU de ls et quelques autres outils pour FreeBSD, OpenBSD, MacOS X, * optionel: keychain (sous ce nom dans vos paquet), gere proprement votre ssh-agent * l'outillage de base (une console réglée a votre convenance, un X qui fonctionne pour afficher la console)... * des dossiers bien remplis pour mettre en oeuvres les exemples hallucinants a venir, et un $HOME soigneusement chaotique === Pourquoi zsh ? === Parce que: * une completion complete et intelligente * un système de globbing de grande qualité * un historique terrible * plein d'autres trucs dont on ne pourra parler... ===== Premiers pas ===== Donc ouvrez un terminal et $ zsh //zsh-newuser-install// se lance, ce qui n'est pas idéal. Car zsh sans config c'est dur. === Récupération d'une config pour zsh === On va donc utiliser une config de zsh "par défaut"... Pour celà, vous fermez ce terminal et en ouvrez un autre (q + exit). Ne faites pas de $ touch ~/.zshrc, attendez d'avoir telecharge une bonne configuration. $ cd $ svn checkout http://svn.asyd.net/svn/zsh/trunk .zsh $ ln -s .zsh/zshrc .zshrc Note : la config que nous allons utiliser est de asyd, il l'a commencée en 2001, et la maintient depuis. Lancer zsh : $ zsh Arrivé a ce point , on a tous un shell de cette forme : "01:14 (user~host) /home/user % [0.11 0.16 - 41% 3%]" Note : [charge 1 min charge 5 min - charge RAM (en %) charge SWAP (en %)] === Configuration === Pour le prompt, changer les couleurs, eventuelement les infos et leurs dispositions, voir dans rc.os/prompt.zsh puis rc.os. La définition des couleurs se fait dans c.host/default.zsh ===== Utilisation ===== === Exemples === % /usr # 3 frappes gagnées par changement de repertoire % for i in 1 2 3 ; echo $i # plus besoin de do et done Note : Très pratique, bien sûr la forme bash reste compatible avec zsh. D'ailleurs zsh est entièrement compatible avec bash. === Completion === La configuration par défaut n'est pas terrible , et la config d'asyd ne la change pas, je vous ai donc preparé une config. Editez le fichier ~/.zshrc pour y ajouter : #Completion zstyle ':completion:*' completer _expand _complete _approximate zstyle ':completion:*:expand:*' tag-order all-expansions zstyle ':completion:*' ignore-parents parent pwd zstyle ':completion:*' list-colors '' zstyle ':completion:*' menu select=1 zstyle ':completion:*' original true zstyle ':completion:*:approximate:*' max-errors par 'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) numeric )' Puis pour prendre en compte les modifications : % source .zshrc % source ~/.zsh La première frappe sur donne le même résultat qu'avec bash par contre les frappes suivantes permettent de parcourir les différents choix proposés. Pour sortir de la complétion sans choix utilisez +c ou . Le shell propose seulement les répertoires où tu es susceptible d'aller et pas celui où l'on se trouve déjà. Pour changer celà, if faut supprimer zstyle ':completion:*' ignore-parents parent pwd du fichier .zshrc. % mplayer /un/dossier/avec/des/video/ Ici seules les vidéos sont listées. De même avec votre éditeur de texte, zsh complète avec les fichiers textes seulement. Tester : % apt-cache % apt-get ins % apt-get install opena % ssh Note : Pour comprendre le fonctionnement de l'autocomplétion aller voir dans .zsh/rc et rc.os Vous en avez pour un moment, zsh corrige les typo, travaille avec les users et les groupes. zsh connait **énormément** de patrons de commandes. Tester : % cat `locate Xorg.0.log` # zsh fait l'autocomplétion sur le résultat du locate et affiche directement le résultat % print $(( 1 + 2 ))tab # zsh sait aussi compter Note : Nous sommes toujours sur la même ligne, nous n'avons pas fait depuis tout à l'heure. Tester : % /var/* === Globbing === Tout a l'heure on a utilisé locate pour retrouver Xorg.0.log mais nous aurions pu laisser zsh chercher... Exemple : % cat /**/Xorg.0.log # être patient, sinon +c, +q, l'exemple est un peu extrême Note : * \* c'est tous les fichiers sous le répertoire donné ; * \*\* est un * récursif. Il remplace par tous les fichiers du répertoire ainsi que tous les fichiers des repertoires au sein du répertoire et ainsi de suite. * /88/ = global (fichiers, dossiers) et /* juste fichiers % echo *(/) # retourne juste les répertoires % echo */ # sans les parenthèse zsh retourne aussi les sim-links % echo *(^/) # retourne juste les fichiers Note : Avec (@) on filtre sur les liens symboliques Tester : % mplayer ~/musique/**/*.(flac|wac|aiff) % mplayer ~/musique/**/*.(flac|wav|aiff)~*Police* Le ~ permet d'enlever des éléments de la sélection. % mplayer ~/musique/**/*.(flac|wav|aiff)~*Police*~[pP]ink* # Sans les morceaux dont le nom de fichier comporte Police et sans les morceaux dont le nom commence par Pink ou pink. === Les tableaux === Avec le bash on connaissait 2 types : les nombres et les chaines de caractères. Avec zsh on en ajoute un : le tableau. Un tableau est un groupement de variables. Exemple : % ma_musique=(morceau1.mp3 /media/partage/unautremorceau.mp3) Ceci crée un tableau ma_musique. % echo $ma_musique Ceci affiche le contenu du tableau. On peut ajouter du contenu au tableau % ma_musique=($ma_musique encoreunmorceau.flac) Ou directement % ma_musique[5]=encoreun.flac Note : * contrairement à la norme en vigueur dans les beaux langages, le numérotage du tableau commence à 1. * les tableaux sont infinis : on peut laisser du vide dans le tableaux ou le commencer par la fin. Ecouter de la musique : % mplayer $ma_musique Ou par ordre alphabétique : % mplayer $(print $ma_musique | sort) Note : Nombre d'éléments d'un tableau : ${#ma_musique} Liste aléatoire : % mplayer $ma_musique[$RANDOM%${#ma_musique}] % ma_musique=( /media/*/musique/**/*.(mp3|flac|ogg) ; while true ; do mplayer $ma_musique[$RANDOM%${#ma_musique}] ; done === Jeux === Libre à vous d'ajouter la ligne "autoload tetris" `a votre .zshrc. Puis +x et sasissez 'tetris'. === Soucis === La touche donne une tilde, pour y remédier ajoutez au fichier .zshrc : autoload zkbd [[ ! -f ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE ]] && zkbd source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE Puis % source ~/.zshrc ===== Pour finir ===== Pour mettre zsh en shell par défaut, il faut utiliser la commande chsh. Le chemin du shell est /bin/zsh ===== Bibliographie ===== * man zshtcpsys * man zshzftpsys Le manuel est gigantesque et il est eclaté en une vingtaine de page!