Shells Survival guide
Le shell est :
– l’interpréteur de commande,
– l’interface entre l’utilisateur et les commandes,
– un langage de programmation (interpréteur), il permet donc de réaliser de nouvelles commandes,
– un gestionnaire de processus,
– un environnement de travail configurable.
Pourquoi le scripting ?
Le scripting, si correctement maitrisé, est un moyen rapide "to get the job done" sans le cycle classique code / compilation / test / débogue.
Il est plus simple que le C sur plusieurs points :
- Les commandes sont plus lisibles que du code bas-niveau (à l’exception du perl),
- Le langage est plus puissant grâce aux outils disponibles,
- Il n’y a pas de phase de compilation, d’où une mise au point plus rapide.
Historique des Shells
– sh : Aka Bourne shell, écrit par Steve Bourne dans les bureaux d’AT&T Bell Labs pour Unix V7 (1977). Légé, simple et (à l’origine) comportant très peu de commandes internes (d’où la nécessité d’appeler des commandes externes même pour la plus ridicule des tâches). Il est disponible sur tout ce qui ressemble de près ou de loin à Unix.
– csh : Le C shell. Ecrit par Bill Joy (1979) à Berkeley (qui fondera Sun Microsystems). Beaucoup de choses sont en commun avec le Bourne shell, mais des améliorations ont été apportées pour en faciliter l’utilisation. Les commandes internes utilisées dans les scriptes sont très différentes du sh et plus similaire à la syntaxe du langage C.
– tcsh : Le TC shell. Disponible librement et basé sur le csh (1980). Il comporte beaucoup de fonctionnalités additionnelles afin d’améliorer encore sont utilisation.
– ksh : Le Korn shell, écrit par David Korn (au alentours de 1983) dans les bureaux d’AT&T Bell Labs (maintenant Lucent). Créé comme une mise à jour majeure de sh il reste compatible avec celui-ci malgré le rajout d’un nombre important de commandes internes. Il incorpore aussi des fonctionnalités de tcsh (historique et rappel des commandes...). Il a eu du mal à être accepté car à ses début il était sous licence AT&T. Il est aujourd’hui disponible librement sur tout les systèmes, mais pas forcément installé sur les Unix libre. Il existe deux versions majeures de ksh, ksh88 incorporé dans les Unix AT&T SVR4 et toujours installé sur de nombreux Unix commerciaux, et, ksh93 qui rajoute de nouvelles fonctionnalités, notamment pour la programmation, et un meilleur support de la norme POSIX.
– bash : Le Bourne again shell. Créé par la communauté Open Source GNU/Linux (1987), il est le shell par défaut sous Linux et Mac OS-X. C’est un clone fonctionnel de sh, avec des fonctionnalités additionnelles pour en améliorer sont utilisation, il est conforme POSIX et partiellement compatible ksh.
– zsh : Un clone libre de sh (1990), sur base de ksh,bash et conforme POSIX, mais avec de nombreuses fonctionnalités d’édition de ligne de commande. Il est installé comme shell par défaut sur les systèmes MacOSX récents.
Le Korn shell
Le Bourne shell a été LE language de scripte standard d’UNIX pendant de nombreuses années. Cependant, il lui manquait quelques fonctionnalités pour le rendre plus facilement utilisable.
Heureusement, le Korn shell ajouta beaucoup de fonctionnalités au sh (dont certaines ont été empruntées au C shell) afin de le rendre plus convivial, plus puissant et plus rapide :
– un historique des commandes peut-être mis en place et utilisé (vi ou emacs),
– une compatibilité bourne shell,
– des variables d’environnements supplémentaires (par exemple la définition de directories),
– des commandes Bourne avec de nouvelles fonctionnalités (test, expr, echo),
– des sélections par menu possible,
– des messages d’erreur plus significatifs,
– des alias peuvent être créés.
Qu’est-ce qu’on peu faire avec ksh ?
A heck of a lot !
Vous avez accès à toutes les possibilités d’UNIX, avec en plus des fonctionnalités internes.
Cependant, exécuter tous ces progammes externes résulte souvent à une certaine lenteur, c’est pourquoi le ksh rajoute tant de fonctions internes comparé au sh.
La personnalisation
La personnalisation est un des atouts majeurs du korn shell.
Le fichier .profile permet à chaque utilisateur de personnaliser son environnement de travail, en attribuant des tâches spécifiques de connexion.
On peut ainsi :
– positionner des chemins de recherche,
– mettre en place les protections de fichiers par défaut (umask),
– positionner le type de terminal et l’initialiser,
– positionner des variables d’environnement,
– effectuer des tâches personnalisées nécessaires suivant le site.
Cf. exemple de fichier .profile :
# Sample .profile file
umask 022
PATH=/bin:/usr/bin:/usr/local/bin:.
#set -o emacs
EDITOR=emacs
set -o tabcomplete
PS1="$USERNAME@`uname -n` !$ "
export PATH EDITOR PS1
Les alias permettent de créer de nouvelles commandes à partir de commandes existantes et d’ainsi établir une bibliothèque personnalisable suivant l’environnement de travail.
Dans le cas du ksh, les alias sont à placer dans le fichier d’initialisation défini par la variable d’environnement ENV (en général export ENV=$HOME/.kshrc).
Cf. échantillon de .kshrc :
# Sample .kshrc file
alias j=jobs
alias h=history
alias l= "ls -aFx"
alias ll= "ls -aFxl"
alias psa= "ps -ef | head"
export HISTSIZE=60
Syntaxe
– Cf. doc/manual
– Cf. refcard
Le C-shell
Historiquement le premier shell du système Unix est le Bourne-Shell (sh). Ce shell n’a cessé d’être amélioré et l’université de Berkeley qui a beaucoup contribué à la branche BSD d’Unix a développé le C-Shell (csh), un successeur de sh munit de fonctionnalités étendues par rapport à son ancêtre. Le C-Shell à son tour possède un successeur : TC-Shell (tcsh), ce dernier étend les fonctionnalités de son prédécesseur et apporte davantage de convivialité. Ces caractéristiques en font un équivalent au GNU Bourne-Again-Shell (GNU/bash).
Ces shells syntaxiquement orientés C restent les shells par défaut des flavors BSD et c’est pourquoi nous nous proposons ici d’en faire une rapide présentation (principalement dans un contexte d’interactivité où il est plutôt efficace).
Rq : De nombreux experts l’on critiqué et ce shell comporte de nombreux problèmes (Cf. CshTop10.txt). Certains peuvent être corrigés d’autres non, à surveiller donc...
Fichiers de configuration
Le C shell utilise trois fichiers pour sa customisation, le fichier .cshrc, .login et .logout.
Le fichier .cshrc contient des commandes, des définition de variables et des alias utilisé à chaque exécution du C shell. Dès lors que l’on se connecte, le C shell commence par lire le fichier .cshrc et positionne variables et alias :
#!/bin/csh
# Sample .cshrc file
setenv EXINIT 'set smd sw=4 wm=2'
set ignoreeof noclobber
set path = (/usr/local/bin /usr/sbin /usr/bin $HOME/bin)
# Interactive shell
if ($?prompt) then
set prompt="$USERNAME@`uname -n` % "
set filec
set autolist
set machbeep = nomatch
#set nobeep
set history = 2048
set savehist = 2048
alias f finger -R
alias la ls -aF
alias ll ls -alF
alias lo logout
endif
Le C shell li ensuite le fichier .login, mais uniquement lors de session de login. Il est utilisé essentiellement pour paramétrer le terminal :
#!/bin/csh
# Sample .login file
stty erase ^H intr ^C susp ^Z
date
setenv EDITOR emacs
Enfin le fichier .logout contient les commandes exécutées à la déconnexion :
#!/bin/csh
# Sample .logout file
echo -n "Logged out."
Documentation
– Cf. Wikipedia
Le Bash
Bash apporte de nombreuses améliorations au Bourne shell, provenant notamment du Korn shell et du C shell.
Scripts exécutés lors du lancement de bash
– Scripts exécutés quand bash est utilisé pour une ouverture de session :
- communs à tous les utilisateurs :
/etc/profile
- spécifiques à chaque utilisateur :
.bash_profile
.bash_login
.profile
.bash_logout # script exécuté lors de la déconnexion
– Scripts exécutés quand bash n’est pas utilisé pour une ouverture de session :
- spécifiques à chaque utilisateur :
.bashrc.
Documentation
– Cf. http://www.gnu.org/software/bash/
– Cf. http://tiswww.case.edu/php/chet/bash/bashtop.html
Programmation
Rq. : Les différences entre le Korn shell et le Bash sont suffisamment faibles pour envisager des scripts communs.
– Cf. Introduction à la programmation en Bash
Z Shell
Souvent le shell par défaut sous Linux est bash (notamment Ubuntu), c’est un shell qui a bien des avantages (notamment pour les scripts), mais il est assez limité dans certaines fonctionnalités comme l’auto-complétion. Zsh est plutôt orienté pour l’interactivité avec l’utilisateur.
Fonctionnalités étendues
– Une complétion des commandes très largement au dessus des possibilités de Bash
– Remplacement d’une partie des chemins
– Prompt à gauche et à droite qui disparaît si l’espace devient manquant
– Correction d’erreur lors de la frappe d’une commande
– Globbing étendu
-
ls -l *.log
=> classique -
ls -l **/*.log
=> récursif
– Édition interactive de variable d’environnement ($ vared PATH
va afficher le contenu de la variable et de l’éditer directement )
– Renommage de fichiers programmable- historique intelligent qui ne propose que ce qui correspond à ce que vous avez commencé à taper
– Historique partagé entre les consoles
– Expansion des variables d’environnement ($PATH
et tabulation remplace la variable par son contenu)
– Alias locaux : alias ls=’ls –color=auto’
- mais aussi alias globaux (
$ alias -g gp='| grep -i'
permet de faire$ ps aux gp ruby
qui donneps aux | grep -i ruby
- alias suffixes
– ...
Documentation
– Cf. http://www.zsh.org/
– Cf. https://www-s.acm.illinois.edu/workshops/zsh/toc.html
Personnalisation
– Cf. http://grml.org/zsh/zsh-lovers.html
– Cf. Oh My ZSH ! & FIZSH