Shells Survival guide

, par MiKaël Navarro

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 :

  1. Les commandes sont plus lisibles que du code bas-niveau (à l’exception du perl),
  2. Le langage est plus puissant grâce aux outils disponibles,
  3. 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...

CshTop10.txt

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 donne ps 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

P.-S.

EShell - The Emacs Shell

Un shell, implémenté entièrement en ELisp, qui tourne dans un buffer Emacs.

Deux principales raisons pour ne pas s’en passer :
 Vous utilisez Emacs partout, rendant l’EShell plus portable que ses alternatives ;
 Vous profitez de la puissance des fonctions ELisp pour vos scripts.